diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp index fcfd0f21340bcd45f647c67bfd748c6ede5cd79e..c07953a30e21bff4353321dde7b49839d81ab5dc 100644 --- a/Mesh/Field.cpp +++ b/Mesh/Field.cpp @@ -1,4 +1,4 @@ -// $Id: Field.cpp,v 1.32 2008-04-18 08:39:49 remacle Exp $ +// $Id: Field.cpp,v 1.33 2008-04-18 12:07:46 remacle Exp $ // // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle // @@ -582,6 +582,47 @@ public: return dialogBox; } }; +class CurvatureField:public Field +{ + int iField; + double delta; +public: + const char *get_name() + { + return "Curvature"; + } + CurvatureField():iField(0), delta(CTX.lc / 1e4) + { + options["IField"] = new FieldOptionInt(iField); + options["Delta"] = new FieldOptionDouble(delta); + } + void grad_norm(Field &f,double x,double y,double z, double *g){ + g[0]=f(x+delta/2,y,z)-f(x-delta/2,y,z); + g[1]=f(x,y+delta/2,z)-f(x,y-delta/2,z); + g[2]=f(x,y,z+delta/2)-f(x,y,z-delta/2); + double n=sqrt(g[0]*g[0]+g[1]*g[1]+g[2]*g[2]); + g[0]/=n; + g[1]/=n; + g[2]/=n; + } + double operator() (double x, double y, double z) + { + Field *field = GModel::current()->getFields()->get(iField); + double grad[6][3]; + grad_norm(*field,x+delta/2,y,z,grad[0]); + grad_norm(*field,x-delta/2,y,z,grad[1]); + grad_norm(*field,x,y+delta/2,z,grad[2]); + grad_norm(*field,x,y-delta/2,z,grad[3]); + grad_norm(*field,x,y,z+delta/2,grad[4]); + grad_norm(*field,x,y,z-delta/2,grad[5]); + return (grad[0][0]-grad[1][0]+grad[2][1]-grad[3][1]+grad[4][2]-grad[5][2])/delta; + } + FieldDialogBox *&dialog_box() + { + static FieldDialogBox *dialogBox = NULL; + return dialogBox; + } +}; class LaplacianField:public Field { int iField; @@ -1065,6 +1106,7 @@ FieldManager::FieldManager() map_type_name["UTM"] = new FieldFactoryT < UTMField > (); map_type_name["Laplacian"] = new FieldFactoryT < LaplacianField > (); map_type_name["Mean"] = new FieldFactoryT < MeanField > (); + map_type_name["Curvature"] = new FieldFactoryT < CurvatureField > (); background_field = -1; }