[cig-commits] commit: Add ability to get StandardConditionFunction from a file
Mercurial
hg at geodynamics.org
Fri Oct 8 17:11:29 PDT 2010
changeset: 768:6716adbe94c7
user: Walter Landry <wlandry at caltech.edu>
date: Fri Oct 08 15:17:50 2010 -0700
files: plugins/StandardConditionFunctions/StandardConditionFunctions.c plugins/StandardConditionFunctions/StandardConditionFunctions.h
description:
Add ability to get StandardConditionFunction from a file
diff -r 14c8382d09cb -r 6716adbe94c7 plugins/StandardConditionFunctions/StandardConditionFunctions.c
--- a/plugins/StandardConditionFunctions/StandardConditionFunctions.c Tue Jul 27 18:00:11 2010 -0700
+++ b/plugins/StandardConditionFunctions/StandardConditionFunctions.c Fri Oct 08 15:17:50 2010 -0700
@@ -221,6 +221,10 @@ void _StgFEM_StandardConditionFunctions_
condFunc = ConditionFunction_New(StgFEM_StandardConditionFunctions_Quadratic,
(Name)"Quadratic");
+ ConditionFunction_Register_Add( condFunc_Register, condFunc );
+
+ condFunc = ConditionFunction_New(StgFEM_StandardConditionFunctions_File1,
+ (Name)"File1");
ConditionFunction_Register_Add( condFunc_Register, condFunc );
}
@@ -2351,5 +2355,83 @@ void StgFEM_StandardConditionFunctions_Q
*result= a + coord[dim]*(b + c*coord[dim]);
}
+int Binary_Search(double *data, int s, int e, double value);
+void StgFEM_StandardConditionFunctions_File1( Node_LocalIndex node_lI, Variable_Index var_I, void* _context, void* _result )
+{
+ FiniteElementContext * context = (FiniteElementContext*)_context;
+ FeVariable* feVariable = NULL;
+ FeMesh* mesh = NULL;
+ Dictionary* dictionary = context->dictionary;
+ double* result = (double*) _result;
+ double* coord;
+ int dim, i;
+ char *filename;
+ int N;
+ int result_index;
+ double factor;
+ static double *coords=NULL;
+ static double *data=NULL;
+ feVariable = (FeVariable*)FieldVariable_Register_GetByName( context->fieldVariable_Register, "VelocityField" );
+ mesh = feVariable->feMesh;
+ coord = Mesh_GetVertex( mesh, node_lI );
+
+ dim = Dictionary_GetInt( dictionary, "File1_Dim");
+ filename = Dictionary_GetString( dictionary, "File1_Name");
+ N = Dictionary_GetInt( dictionary, "File1_N");
+ Journal_Firewall(dim>=0 && dim<3,
+ Journal_Register( Error_Type,"StgFEM_StandardConditionFunctions_File1"),
+ "File1_Dim must be either 0, 1, or 2, but was set to %d",dim);
+ Journal_Firewall(N>0,
+ Journal_Register( Error_Type,"StgFEM_StandardConditionFunctions_File1"),
+ "File1_N must be greater than zero, but was set to %d.",N);
+ if(data==NULL)
+ {
+
+ FILE *fp=fopen(filename,"r");
+ Journal_Firewall(filename!=NULL,
+ Journal_Register( Error_Type,"StgFEM_StandardConditionFunctions_File1"),
+ "Bad filename for File1_Name. Could not open %s",filename);
+ data=(double *)malloc(N*sizeof(double));
+ coords=(double *)malloc(N*sizeof(double));
+
+ Journal_Firewall(data!=NULL && coords!=NULL,
+ Journal_Register( Error_Type,"StgFEM_StandardConditionFunctions_File1"),
+ "Could not allocate enough memory for File1");
+ for(i=0;i<N;++i)
+ fscanf(fp,"%lf %lf",coords+i,data+i);
+ }
+
+ Journal_Firewall(!(coord[dim]<coords[0] || coord[dim]>coords[N-1]),
+ Journal_Register( Error_Type,"StgFEM_StandardConditionFunctions_File1"),
+ "The range in the file '%s' does not cover this value %g\nIt only covers %g to %g.\n",
+ filename,coord[dim],coords[0],coords[1]);
+
+ result_index=Binary_Search(coords,0,N-1,coord[dim]);
+ factor=(coords[result_index+1]-coord[dim])
+ / (coords[result_index+1]-coords[result_index]);
+
+ *result=data[result_index]*factor + data[result_index+1]*(factor-1);
+}
+
+
+int Binary_Search(double *data, int s, int e, const double value)
+{
+ int start, end, midpoint;
+
+ start=s;
+ end=e;
+ midpoint=e;
+
+ midpoint=(end-start)/2 + start;
+ while(start!=midpoint)
+ {
+ if(data[midpoint]>=value)
+ end=midpoint;
+ else
+ start=midpoint;
+ midpoint=(end-start)/2 + start;
+ }
+ return start;
+}
diff -r 14c8382d09cb -r 6716adbe94c7 plugins/StandardConditionFunctions/StandardConditionFunctions.h
--- a/plugins/StandardConditionFunctions/StandardConditionFunctions.h Tue Jul 27 18:00:11 2010 -0700
+++ b/plugins/StandardConditionFunctions/StandardConditionFunctions.h Fri Oct 08 15:17:50 2010 -0700
@@ -122,6 +122,7 @@ void StgFEM_StandardConditionFunctions_G
void StgFEM_StandardConditionFunctions_GaussianTube( Node_LocalIndex node_lI, Variable_Index var_I, void* _context, void* _result );
void StgFEM_StandardConditionFunctions_WarsTemperature( Node_LocalIndex node_lI, Variable_Index var_I, void* _context, void* _result );
void StgFEM_StandardConditionFunctions_Quadratic( Node_LocalIndex node_lI, Variable_Index var_I, void* _context, void* _result );
+void StgFEM_StandardConditionFunctions_File1( Node_LocalIndex node_lI, Variable_Index var_I, void* _context, void* _result );
#endif
More information about the CIG-COMMITS
mailing list