diff --git a/fedic.py b/fedic.py index 5955b301c782a5ba4d42d9fe4a4710c8511af0ec..a8489e2ae6d27f71ddb8c28abffeefe199498691 100644 --- a/fedic.py +++ b/fedic.py @@ -52,6 +52,7 @@ def fedic( working_basename, images_folder, images_basename, + images_grad_basename=None, images_ext="vti", # vti, vtk images_n_frames=None, images_ref_frame=0, @@ -138,6 +139,8 @@ def fedic( mypy.print_str("Computing quadrature degree for images…",tab) ref_image_filename = images_folder+"/"+images_basename+"_"+str(images_ref_frame).zfill(images_zfill)+"."+images_ext + if (images_grad_basename is not None): + ref_image_grad_filename = images_folder+"/"+images_grad_basename+"_"+str(images_ref_frame).zfill(images_zfill)+"."+images_ext if (images_quadrature is None): if (images_quadrature_from == "points_count"): images_quadrature = ddic.compute_quadrature_degree_from_points_count( @@ -196,10 +199,10 @@ def fedic( DIref = dolfin.Expression( cppcode=ddic.get_ExprIm_cpp( im_dim=images_dimension, - im_type="grad", + im_type="grad" if (images_grad_basename is None) else "grad_no_deriv", im_is_def=0), element=ve) - DIref.init_image(ref_image_filename) + DIref.init_image(ref_image_filename if (images_grad_basename is None) else ref_image_grad_filename) elif (images_expressions_type == "py"): if (images_dimension == 2): Iref = ddic.ExprIm2( @@ -402,7 +405,7 @@ def fedic( DIdef = dolfin.Expression( cppcode=ddic.get_ExprIm_cpp( im_dim=images_dimension, - im_type="grad", + im_type="grad" if (images_grad_basename is None) else "grad_no_deriv", im_is_def=1), element=ve) DIdef.init_dynamic_scaling(scaling) @@ -420,7 +423,7 @@ def fedic( DIold = dolfin.Expression( cppcode=ddic.get_ExprIm_cpp( im_dim=images_dimension, - im_type="grad", + im_type="grad" if (images_grad_basename is None) else "grad_no_deriv", im_is_def=1), element=ve) DIold.init_dynamic_scaling(scaling) # 2016/07/25: ok, same scaling must apply to Idef & Iold… @@ -564,12 +567,20 @@ def fedic( mypy.print_str("Loading image, image gradient and image hessian…",tab) image_filename = images_folder+"/"+images_basename+"_"+str(k_frame).zfill(images_zfill)+"."+images_ext Idef.init_image(image_filename) - DIdef.init_image(image_filename) + if (images_grad_basename is None): + DIdef.init_image(image_filename) + else: + image_grad_filename = images_folder+"/"+images_grad_basename+"_"+str(k_frame).zfill(images_zfill)+"."+images_ext + DIdef.init_image(image_grad_filename) if ("-wHess" in tangent_type): DDIdef.init_image(image_filename) image_filename = images_folder+"/"+images_basename+"_"+str(k_frame_old).zfill(images_zfill)+"."+images_ext Iold.init_image(image_filename) - DIold.init_image(image_filename) + if (images_grad_basename is None): + DIold.init_image(image_filename) + else: + image_grad_filename = images_folder+"/"+images_grad_basename+"_"+str(k_frame_old).zfill(images_zfill)+"."+images_ext + DIold.init_image(image_grad_filename) U.vector().zero() im_diff_0 = (dolfin.assemble(psi_c * dV, form_compiler_parameters=form_compiler_parameters_for_images)/mesh_V0)**(1./2) diff --git a/image_expressions_cpp.py b/image_expressions_cpp.py index c9cd767f2f647e5c5182c555745eaa35e27901db..4b98af09470cc064994c0f6b46ebe0fc485e80c5 100644 --- a/image_expressions_cpp.py +++ b/image_expressions_cpp.py @@ -17,7 +17,7 @@ def get_ExprIm_cpp( verbose=0): assert (im_dim in (2,3)) - assert (im_type in ("im","grad")) + assert (im_type in ("im","grad","grad_no_deriv")) ExprIm_cpp = '''\ #include <string.h> @@ -58,7 +58,7 @@ class MyExpr : public Expression public: MyExpr(): - Expression('''+str(im_dim)*(im_type=="grad")+''')'''+(''', + Expression('''+str(im_dim)*(im_type in ("grad", "grad_no_deriv"))+''')'''+(''', dynamic_scaling_a(1.), // should not be needed dynamic_scaling_b(0.), // should not be needed UX('''+str(im_dim)+'''), @@ -91,8 +91,8 @@ public: void init_image( const char* filename, - const char* interpol_mode="'''+('''linear''')*(im_type=="im")+('''linear''')*(im_type=="grad")+'''", - const double &interpol_out_value='''+('''0.''')*(im_type=="im")+('''0.''')*(im_type=="grad")+(''', + const char* interpol_mode="'''+('''linear''')*(im_type=="im")+('''linear''')*(im_type in ("grad", "grad_no_deriv"))+'''", + const double &interpol_out_value='''+('''0.''')*(im_type=="im")+('''0.''')*(im_type in ("grad", "grad_no_deriv"))+(''', const double &Z=0.''')*(im_dim==2)+''') { vtkSmartPointer<vtkXMLImageDataReader> reader = vtkSmartPointer<vtkXMLImageDataReader>::New(); @@ -129,7 +129,7 @@ public: assert(0); } interpolator->SetOutValue(interpol_out_value); - interpolator->Initialize('''+('''reader->GetOutput()''')*(im_type=="im")+('''gradient->GetOutput()''')*(im_type=="grad")+'''); + interpolator->Initialize('''+('''reader->GetOutput()''')*(im_type in ("im", "grad_no_deriv"))+('''gradient->GetOutput()''')*(im_type=="grad")+'''); interpolator->Update();'''+(''' x[2] = Z;''')*(im_is_def)*(im_dim==2)+('''