diff --git a/Energy.py b/Energy.py index a645ef42bb0639043bb6ac83b2253ad86360a0c6..064cca612fd9e3ac23e70fb2139937635c6e1ada 100644 --- a/Energy.py +++ b/Energy.py @@ -29,6 +29,14 @@ class Energy(): + def call_before_assembly(self, + *args, + **kwargs): + + pass + + + def call_before_solve(self, *args, **kwargs): diff --git a/Energy_GeneratedImage.py b/Energy_GeneratedImage.py index 8757b91291f3569ba936bf521b92c4f7c6f2f5a1..d22e75058906ad08963f1eaac8cc7e426f42f2c4 100644 --- a/Energy_GeneratedImage.py +++ b/Energy_GeneratedImage.py @@ -29,8 +29,7 @@ class WarpedImageEnergy(Energy): quadrature_degree, name="im", w=1., - ref_frame=0, - dynamic_scaling=False): + ref_frame=0): self.problem = problem self.printer = self.problem.printer @@ -39,7 +38,6 @@ class WarpedImageEnergy(Energy): self.name = name self.w = w self.ref_frame = ref_frame - self.dynamic_scaling = dynamic_scaling self.printer.print_str("Defining warped image correlation energy…") self.printer.inc() @@ -78,6 +76,7 @@ class WarpedImageEnergy(Energy): self.printer.print_str("Defining measure…") + # dV self.form_compiler_parameters = { "quadrature_degree":self.quadrature_degree, "quadrature_scheme":"default"} @@ -86,50 +85,33 @@ class WarpedImageEnergy(Energy): domain=self.problem.mesh, metadata=self.form_compiler_parameters) - self.printer.print_str("Loading reference image…") - self.printer.inc() - # ref_frame assert (abs(self.ref_frame) < self.image_series.n_frames),\ "abs(ref_frame) = "+str(abs(self.ref_frame))+" >= "+str(self.image_series.n_frames)+" = image_series.n_frames. Aborting." self.ref_frame = self.ref_frame%self.image_series.n_frames + self.ref_image_filename = self.image_series.get_image_filename(self.ref_frame) self.printer.print_var("ref_frame",self.ref_frame) - # Iref - self.Iref = dolfin.Expression( - cppcode=ddic.get_ExprIm_cpp( + self.printer.dec() + self.printer.print_str("Defining deformed image…") + + # Igen + self.Igen = dolfin.Expression( + cppcode=ddic.get_ExprGenIm_cpp( im_dim=self.image_series.dimension, - im_type="im", - im_is_def=0), + im_type="im"), element=self.fe) - self.ref_image_filename = self.image_series.get_image_filename(self.ref_frame) - self.Iref.init_image(self.ref_image_filename) - - self.Iref_int = dolfin.assemble(self.Iref * self.dV)/self.problem.mesh_V0 - self.printer.print_var("Iref_int",self.Iref_int) + self.Igen.init_image(self.ref_image_filename) + self.Igen.init_disp(self.problem.U) - self.Iref_norm = (dolfin.assemble(self.Iref**2 * self.dV)/self.problem.mesh_V0)**(1./2) - assert (self.Iref_norm > 0.),\ - "Iref_norm = "+str(self.Iref_norm)+" <= 0. Aborting." - self.printer.print_var("Iref_norm",self.Iref_norm) - - # DIref - self.DIref = dolfin.Expression( - cppcode=ddic.get_ExprIm_cpp( + # DIgen + self.DIgen = dolfin.Expression( + cppcode=ddic.get_ExprGenIm_cpp( im_dim=self.image_series.dimension, - im_type="grad" if (self.image_series.grad_basename is None) else "grad_no_deriv", - im_is_def=0), + im_type="grad"), element=self.ve) - self.ref_image_grad_filename = self.image_series.get_image_grad_filename(self.ref_frame) - self.DIref.init_image(self.ref_image_grad_filename) - - self.printer.dec() - self.printer.print_str("Defining deformed image…") - - self.scaling = numpy.array([1.,0.]) - if (self.dynamic_scaling): - self.p = numpy.empty((2,2)) - self.q = numpy.empty(2) + self.Igen.init_image(self.ref_image_filename) + self.Igen.init_disp(self.problem.U) # Idef self.Idef = dolfin.Expression( @@ -140,7 +122,6 @@ class WarpedImageEnergy(Energy): element=self.fe) self.Idef.init_image(self.ref_image_filename) self.Idef.init_disp(self.problem.U) - self.Idef.init_dynamic_scaling(self.scaling) # DIdef self.DIdef = dolfin.Expression( @@ -151,32 +132,9 @@ class WarpedImageEnergy(Energy): element=self.ve) self.DIdef.init_image(self.ref_image_filename) self.DIdef.init_disp(self.problem.U) - self.DIdef.init_dynamic_scaling(self.scaling) self.printer.print_str("Defining previous image…") - # Iold - self.Iold = dolfin.Expression( - cppcode=ddic.get_ExprIm_cpp( - im_dim=self.image_series.dimension, - im_type="im", - im_is_def=1), - element=self.fe) - self.Iold.init_image(self.ref_image_filename) - self.Iold.init_disp(self.problem.Uold) - self.Iold.init_dynamic_scaling(self.scaling) # 2016/07/25: ok, same scaling must apply to Idef & Iold… - - # DIold - self.DIold = dolfin.Expression( - cppcode=ddic.get_ExprIm_cpp( - im_dim=self.image_series.dimension, - im_type="grad" if (self.image_series.grad_basename is None) else "grad_no_deriv", - im_is_def=1), - element=self.ve) - self.DIold.init_image(self.ref_image_filename) - self.DIold.init_disp(self.problem.Uold) - self.DIold.init_dynamic_scaling(self.scaling) # 2016/07/25: ok, same scaling must apply to Idef & Iold… - self.printer.print_str("Defining correlation energy…") # Phi_ref @@ -187,15 +145,9 @@ class WarpedImageEnergy(Energy): self.Phi_Iref.init_image(self.ref_image_filename) # Psi_c - self.Psi_c = self.Phi_Iref * (self.Idef - self.Iref)**2/2 - self.DPsi_c = self.Phi_Iref * (self.Idef - self.Iref) * dolfin.dot(self.DIdef, self.problem.dU_test) - - self.DDPsi_c = self.Phi_Iref * dolfin.dot(self.DIdef, self.problem.dU_trial) * dolfin.dot(self.DIdef, self.problem.dU_test) - self.DDPsi_c_old = self.Phi_Iref * dolfin.dot(self.DIold, self.problem.dU_trial) * dolfin.dot(self.DIold, self.problem.dU_test) - self.DDPsi_c_ref = self.Phi_Iref * dolfin.dot(self.DIref, self.problem.dU_trial) * dolfin.dot(self.DIref, self.problem.dU_test) - - self.Psi_c_old = self.Phi_Iref * (self.Idef - self.Iold)**2/2 - self.DPsi_c_old = self.Phi_Iref * (self.Idef - self.Iold) * dolfin.dot(self.DIdef, self.problem.dU_test) + self.Psi_c = self.Phi_Iref * (self.Igen - self.Idef)**2/2 + self.DPsi_c = self.Phi_Iref * (self.Igen - self.Idef) * dolfin.dot(self.DIgen - self.DIdef, self.problem.dU_test) + self.DDPsi_c = self.Phi_Iref * dolfin.dot(self.DIgen - self.DIdef, self.problem.dU_trial) * dolfin.dot(self.DIgen - self.DIdef, self.problem.dU_test) # forms self.ener_form = self.Psi_c * self.dV @@ -208,7 +160,14 @@ class WarpedImageEnergy(Energy): def reinit(self): - self.scaling[:] = [1.,0.] + pass + + + + def call_before_assembly(self): + + self.Igen.generate_image() + self.DIgen.generate_image() @@ -226,16 +185,6 @@ class WarpedImageEnergy(Energy): self.def_grad_image_filename = self.image_series.get_image_grad_filename(k_frame) self.DIdef.init_image(self.def_grad_image_filename) - self.printer.print_str("Loading previous image for correlation energy…") - - # Iold - self.old_image_filename = self.image_series.get_image_filename(k_frame_old) - self.Iold.init_image(self.old_image_filename) - - # DIold - self.old_grad_image_filename = self.image_series.get_image_grad_filename(k_frame_old) - self.DIold.init_image(self.old_grad_image_filename) - def call_after_solve(self): @@ -246,7 +195,7 @@ class WarpedImageEnergy(Energy): def get_qoi_names(self): - return [self.name+"_ener", self.name+"_err"] + return [self.name+"_ener"] @@ -254,7 +203,5 @@ class WarpedImageEnergy(Energy): self.ener = (dolfin.assemble(self.ener_form)/self.problem.mesh_V0)**(1./2) self.printer.print_sci(self.name+"_ener",self.ener) - self.err = self.ener/self.Iref_norm - self.printer.print_sci(self.name+"_err",self.err) - return [self.ener, self.err] + return [self.ener] diff --git a/NonlinearSolver.py b/NonlinearSolver.py index 7bba64cf5312416c168934068df05ea97f256378..c983d8dbc25274030d3f1af97b4953c3a2f2ea15 100644 --- a/NonlinearSolver.py +++ b/NonlinearSolver.py @@ -179,6 +179,8 @@ class NonlinearSolver(): self.res_old_vec = self.res_vec.copy() self.res_old_norm = self.res_norm + self.problem.call_before_assembly() + # linear system: residual assembly self.printer.print_str("Residual assembly…",newline=False) timer = time.time() @@ -281,6 +283,7 @@ class NonlinearSolver(): self.printer.print_var("relax_k",relax_k,-1) # self.printer.print_sci("relax_a",relax_a) # self.printer.print_sci("relax_b",relax_b) + self.problem.call_before_assembly() if (need_update_c): relax_c = relax_b - (relax_b - relax_a) / phi relax_list.append(relax_c) diff --git a/Problem_ImageRegistration.py b/Problem_ImageRegistration.py index fdf6396a8dc1e490f6abd6d46089f2d902bfd691..d0898f9edd6cf8346c5add70472f96fb5b00ebb5 100644 --- a/Problem_ImageRegistration.py +++ b/Problem_ImageRegistration.py @@ -179,6 +179,17 @@ class ImageRegistrationProblem(Problem): + def call_before_assembly(self, + *kargs, + **kwargs): + + for energy in self.energies: + energy.call_before_assembly( + *kargs, + **kwargs) + + + def assemble_ener(self): ener_form = 0. diff --git a/image_expressions_cpp.py b/image_expressions_cpp.py index 4b98af09470cc064994c0f6b46ebe0fc485e80c5..361fe93094eb34320c0ead07f6bf9cec2b04de09 100644 --- a/image_expressions_cpp.py +++ b/image_expressions_cpp.py @@ -14,6 +14,7 @@ def get_ExprIm_cpp( im_dim, im_type="im", im_is_def=0, + disp_type="fenics", # "vtk" verbose=0): assert (im_dim in (2,3))