@@ -3882,6 +3882,7 @@ typedef struct {
3882
3882
value * fields ;
3883
3883
value * originalfields ; // Original fields
3884
3884
value method ; // Method dictionary
3885
+ objectmesh * mref ; // Reference mesh
3885
3886
vm * v ;
3886
3887
} integralref ;
3887
3888
@@ -4115,21 +4116,69 @@ static value integral_gradfn(vm *v, int nargs, value *args) {
4115
4116
return out ;
4116
4117
}
4117
4118
4119
+ /* -------------------
4120
+ * Cauchy green strain
4121
+ * ------------------- */
4122
+
4123
+ int cauchygreenhandle ; // TL storage handle for CG tensor
4124
+
4125
+ /** Evaluates the cg strain tensor */
4126
+ void integral_evaluatecg (vm * v , value * out ) {
4127
+ objectintegralelementref * elref = integral_getelementref (v );
4128
+
4129
+ if (!elref || !elref -> iref -> mref ) {
4130
+ morpho_runtimeerror (v , INTEGRAL_SPCLFN , CGTENSOR_FUNCTION ); return ;
4131
+ }
4132
+
4133
+ int gdim = elref -> nv - 1 ; // Dimension of Gram matrix
4134
+
4135
+ objectmatrix * cg = object_newmatrix (gdim , gdim , true);
4136
+ if (!cg ) { morpho_runtimeerror (v , ERROR_ALLOCATIONFAILED ); return ; }
4137
+
4138
+ double gramrefel [gdim * gdim ], gramdefel [gdim * gdim ], qel [gdim * gdim ], rel [gdim * gdim ];
4139
+ objectmatrix gramref = MORPHO_STATICMATRIX (gramrefel , gdim , gdim ); // Gram matrices
4140
+ objectmatrix gramdef = MORPHO_STATICMATRIX (gramdefel , gdim , gdim ); //
4141
+ objectmatrix q = MORPHO_STATICMATRIX (qel , gdim , gdim ); // Inverse of Gram in source domain
4142
+ objectmatrix r = MORPHO_STATICMATRIX (rel , gdim , gdim ); // Intermediate calculations
4143
+
4144
+ linearelasticity_calculategram (elref -> iref -> mref -> vert , elref -> mesh -> dim , elref -> nv , elref -> vid , & gramref );
4145
+ linearelasticity_calculategram (elref -> mesh -> vert , elref -> mesh -> dim , elref -> nv , elref -> vid , & gramdef );
4146
+
4147
+ if (matrix_inverse (& gramref , & q )!= MATRIX_OK ) return false;
4148
+ if (matrix_mul (& gramdef , & q , & r )!= MATRIX_OK ) return false;
4149
+
4150
+ matrix_identity (cg );
4151
+ matrix_scale (cg , -0.5 );
4152
+ matrix_accumulate (cg , 0.5 , & r );
4153
+
4154
+ vm_settlvar (v , cauchygreenhandle , MORPHO_OBJECT (cg ));
4155
+ * out = MORPHO_OBJECT (cg );
4156
+ }
4157
+
4158
+ static value integral_cgfn (vm * v , int nargs , value * args ) {
4159
+ value out = MORPHO_NIL ;
4160
+
4161
+ vm_gettlvar (v , cauchygreenhandle , & out );
4162
+ if (MORPHO_ISNIL (out )) integral_evaluatecg (v , & out );
4163
+
4164
+ return out ;
4165
+ }
4166
+
4118
4167
/* ----------------------
4119
4168
* General initialization
4120
4169
* ---------------------- */
4121
4170
4122
4171
/** Clears threadlocal storage */
4123
4172
void integral_cleartlvars (vm * v ) {
4124
- int handles [] = { elementhandle , normlhandle , tangenthandle , -1 };
4173
+ int handles [] = { elementhandle , normlhandle , tangenthandle , cauchygreenhandle , -1 };
4125
4174
4126
4175
for (int i = 0 ; handles [i ]>=0 ; i ++ ) {
4127
4176
vm_settlvar (v , handles [i ], MORPHO_NIL );
4128
4177
}
4129
4178
}
4130
4179
4131
4180
void integral_freetlvars (vm * v ) {
4132
- int handles [] = { normlhandle , tangenthandle , -1 };
4181
+ int handles [] = { normlhandle , tangenthandle , cauchygreenhandle , -1 };
4133
4182
4134
4183
for (int i = 0 ; handles [i ]>=0 ; i ++ ) {
4135
4184
value val ;
@@ -4150,17 +4199,23 @@ value functional_methodproperty;
4150
4199
bool integral_prepareref (objectinstance * self , objectmesh * mesh , grade g , objectselection * sel , integralref * ref ) {
4151
4200
bool success = false;
4152
4201
value func = MORPHO_NIL ;
4202
+ value mref = MORPHO_NIL ;
4153
4203
value field = MORPHO_NIL ;
4154
4204
value method = MORPHO_NIL ;
4155
4205
ref -> v = NULL ;
4156
4206
ref -> nfields = 0 ;
4157
4207
ref -> method = MORPHO_NIL ;
4208
+ ref -> mref = NULL ;
4158
4209
4159
4210
if (objectinstance_getpropertyinterned (self , scalarpotential_functionproperty , & func ) &&
4160
4211
MORPHO_ISCALLABLE (func )) {
4161
4212
ref -> integrand = func ;
4162
4213
success = true;
4163
4214
}
4215
+ if (objectinstance_getpropertyinterned (self , linearelasticity_referenceproperty , & mref ) &&
4216
+ MORPHO_ISMESH (mref )) {
4217
+ ref -> mref = MORPHO_GETMESH (mref );
4218
+ }
4164
4219
if (objectinstance_getpropertyinterned (self , functional_methodproperty , & method )) {
4165
4220
ref -> method = method ;
4166
4221
}
@@ -4290,10 +4345,13 @@ value LineIntegral_init(vm *v, int nargs, value *args) {
4290
4345
int nparams = -1 ;
4291
4346
int nfixed ;
4292
4347
value method = MORPHO_NIL ;
4348
+ value mref = MORPHO_NIL ;
4293
4349
4294
- if (builtin_options (v , nargs , args , & nfixed , 1 ,
4295
- functional_methodproperty , & method )) {
4350
+ if (builtin_options (v , nargs , args , & nfixed , 2 ,
4351
+ functional_methodproperty , & method ,
4352
+ linearelasticity_referenceproperty , & mref )) {
4296
4353
if (MORPHO_ISDICTIONARY (method )) objectinstance_setproperty (self , functional_methodproperty , method );
4354
+ if (MORPHO_ISMESH (mref )) objectinstance_setproperty (self , linearelasticity_referenceproperty , mref );
4297
4355
} else {
4298
4356
morpho_runtimeerror (v , LINEINTEGRAL_ARGS );
4299
4357
return MORPHO_NIL ;
@@ -4638,6 +4696,7 @@ void functional_initialize(void) {
4638
4696
builtin_addfunction (TANGENT_FUNCTION , integral_tangent , BUILTIN_FLAGSEMPTY );
4639
4697
builtin_addfunction (NORMAL_FUNCTION , integral_normal , BUILTIN_FLAGSEMPTY );
4640
4698
builtin_addfunction (GRAD_FUNCTION , integral_gradfn , BUILTIN_FLAGSEMPTY );
4699
+ builtin_addfunction (CGTENSOR_FUNCTION , integral_cgfn , BUILTIN_FLAGSEMPTY );
4641
4700
4642
4701
morpho_defineerror (FUNC_INTEGRAND_MESH , ERROR_HALT , FUNC_INTEGRAND_MESH_MSG );
4643
4702
morpho_defineerror (FUNC_ELNTFND , ERROR_HALT , FUNC_ELNTFND_MSG );
@@ -4672,6 +4731,7 @@ void functional_initialize(void) {
4672
4731
elementhandle = vm_addtlvar ();
4673
4732
tangenthandle = vm_addtlvar ();
4674
4733
normlhandle = vm_addtlvar ();
4734
+ cauchygreenhandle = vm_addtlvar ();
4675
4735
4676
4736
morpho_addfinalizefn (functional_finalize );
4677
4737
}
0 commit comments