diff --git a/ImageIterator.py b/ImageIterator.py index 08dd004efe5cf9bd61341f3ed2eeb04d4c4193c2..e650c94a79d970e8f14af73361e1ed66a9e0ff24 100644 --- a/ImageIterator.py +++ b/ImageIterator.py @@ -8,9 +8,12 @@ ### ### ################################################################################ +import dolfin import glob +import numpy import os import time +import vtk import myPythonLibrary as mypy import myVTKPythonLibrary as myvtk @@ -34,6 +37,11 @@ class ImageIterator(): self.working_folder = parameters["working_folder"] if ("working_folder" in parameters) else "." self.working_basename = parameters["working_basename"] if ("working_basename" in parameters) else "sol" + self.initialize_U_from_file = parameters["initialize_U_from_file"] if ("initialize_U_from_file" in parameters) else False + self.initialize_U_folder = parameters["initialize_U_folder"] if ("initialize_U_folder" in parameters) else "." + self.initialize_U_basename = parameters["initialize_U_basename"] if ("initialize_U_basename" in parameters) else None + self.initialize_U_ext = parameters["initialize_U_ext"] if ("initialize_U_ext" in parameters) else "vtu" + self.initialize_U_array_name = parameters["initialize_U_array_name"] if ("initialize_U_array_name" in parameters) else "displacement" self.initialize_DU_with_DUold = parameters["initialize_DU_with_DUold"] if ("initialize_DU_with_DUold" in parameters) else False @@ -69,6 +77,15 @@ class ImageIterator(): self.printer.dec() self.printer.print_str("Looping over frames…") + if (self.initialize_U_from_file): + mesh_series = ddic.MeshSeries( + problem=self.problem, + folder=self.initialize_U_folder, + basename=self.initialize_U_basename, + ext=self.initialize_U_ext) + + dof_to_vertex_map = dolfin.dof_to_vertex_map(self.problem.U_fs) + n_iter_tot = 0 global_success = True for forward_or_backward in ["forward","backward"]: @@ -94,7 +111,18 @@ class ImageIterator(): k_frame_old = k_frame+1 #self.printer.print_var("k_frame_old",k_frame_old,-1) - if (self.initialize_DU_with_DUold): + if (self.initialize_U_from_file): + mesh = mesh_series.get_mesh(k_frame) + array_U = mesh.GetPointData().GetArray(self.initialize_U_array_name) + array_U = vtk.util.numpy_support.vtk_to_numpy(array_U)[:,:self.problem.mesh_dimension] + # print array_U + # array_U = array_U.astype(float) + # print array_U + array_U = numpy.reshape(array_U, array_U.size) + # print array_U + self.problem.U.vector()[:] = array_U[dof_to_vertex_map] + + elif (self.initialize_DU_with_DUold): self.problem.U.vector().axpy(1., self.problem.DUold.vector()) self.problem.call_before_solve( diff --git a/MeshSeries.py b/MeshSeries.py new file mode 100644 index 0000000000000000000000000000000000000000..e61c69241269a811c66fe8ca755fb85b40856b5c --- /dev/null +++ b/MeshSeries.py @@ -0,0 +1,73 @@ +#coding=utf8 + +################################################################################ +### ### +### Created by Martin Genet, 2016-2018 ### +### ### +### École Polytechnique, Palaiseau, France ### +### ### +################################################################################ + +import glob + +import myPythonLibrary as mypy +import myVTKPythonLibrary as myvtk + +import dolfin_dic as ddic + +################################################################################ + + + +class MeshSeries(): + + + + def __init__(self, + problem, + folder, + basename, + n_frames=None, + ext="vtu"): + + self.problem = problem + self.printer = self.problem.printer + self.folder = folder + self.basename = basename + self.n_frames = n_frames + self.ext = ext + + self.printer.print_str("Reading mesh series…") + self.printer.inc() + + self.filenames = glob.glob(self.folder+"/"+self.basename+"_[0-9]*"+"."+self.ext) + assert (len(self.filenames) >= 1),\ + "Not enough meshes ("+self.folder+"/"+self.basename+"_[0-9]*"+"."+self.ext+"). Aborting." + + if (self.n_frames is None): + self.n_frames = len(self.filenames) + else: + assert (self.n_frames <= len(self.filenames)) + assert (self.n_frames >= 1),\ + "n_frames = "+str(self.n_frames)+" < 2. Aborting." + self.printer.print_var("n_frames",self.n_frames) + + self.zfill = len(self.filenames[0].rsplit("_",1)[-1].split(".",1)[0]) + + self.printer.dec() + + + + def get_mesh_filename(self, + k_frame): + + return self.folder+"/"+self.basename+"_"+str(k_frame).zfill(self.zfill)+"."+self.ext + + + + def get_mesh(self, + k_frame): + + return myvtk.readDataSet( + filename=self.get_mesh_filename( + k_frame=k_frame)) diff --git a/__init__.py b/__init__.py index 9deddd46220b2a07376a6436b44c404b8e61fc0f..222a8f73c40a23f4d98e50fcb7e42f302b820a07 100644 --- a/__init__.py +++ b/__init__.py @@ -1,30 +1,31 @@ #this file was generated by __init__.py.py -from fedic2 import * -from NonlinearSolver import * -from compute_warped_mesh import * -from image_expressions_py import * -from compute_warped_images import * +from compute_displacement_error import * +from compute_displacements import * +from compute_quadrature_degree import * +from compute_strains import * from compute_unwarped_images import * +from compute_warped_images import * +from compute_warped_mesh import * +from Energy import * +from Energy_Regularization import * +from Energy_WarpedImage import * from fedic import * +from fedic2 import * from generate_images import * -from plot_binned_strains_vs_radius import * -from plot_regional_strains import * -from ImageIterator import * -from Problem import * -from Energy_WarpedImage import * from generate_undersampled_images import * -from Energy_Regularization import * -from compute_strains import * -from compute_displacements import * -from compute_displacement_error import * -from ImageSeries import * -from compute_quadrature_degree import * from generated_image_expressions_cpp import * -from write_VTU_file import * -from Energy import * from image_expressions_cpp import * -from Problem_ImageRegistration import * -from plot_strains import * +from image_expressions_py import * +from ImageIterator import * +from ImageSeries import * +from MeshSeries import * +from NonlinearSolver import * +from plot_binned_strains_vs_radius import * from plot_displacement_error import * +from plot_regional_strains import * +from plot_strains import * from plot_strains_vs_radius import * +from Problem import * +from Problem_ImageRegistration import * +from write_VTU_file import * diff --git a/fedic2.py b/fedic2.py index ac4143cb0e71c72ebc5268ee5f0d62b5ed897595..af560c58da46f45725ea79cafa251276ba141983 100644 --- a/fedic2.py +++ b/fedic2.py @@ -41,6 +41,11 @@ def fedic2( residual_type="Iref", # Iref, Iold, Iref-then-Iold relax_type="gss", # constant, aitken, gss relax_init=1.0, + initialize_U_from_file=0, + initialize_U_folder=None, + initialize_U_basename=None, + initialize_U_ext="vtu", + initialize_U_array_name="displacement", initialize_DU_with_DUold=0, tol_res=None, tol_res_rel=None, @@ -59,6 +64,8 @@ def fedic2( "residual_type must be \"Iref\". Aborting." assert (relax_init == 1.),\ "relax_init must be 1. Aborting." + assert (not ((initialize_U_from_file) and (initialize_DU_with_DUold))),\ + "Cannot initialize U from file and DU with DUold together. Aborting." assert (tol_res is None),\ "tol_res is deprecated. Aborting." assert (tol_im is None),\ @@ -135,6 +142,11 @@ def fedic2( parameters={ "working_folder":working_folder, "working_basename":working_basename, + "initialize_U_from_file":initialize_U_from_file, + "initialize_U_folder":initialize_U_folder, + "initialize_U_basename":initialize_U_basename, + "initialize_U_ext":initialize_U_ext, + "initialize_U_array_name":initialize_U_array_name, "initialize_DU_with_DUold":initialize_DU_with_DUold}) image_iterator.iterate()