Fortran introduction to CellML in OpenCMISS-IronΒΆ
This example provides an entry level demonstration of creating fields in OpenCMISS-Iron to be defined using CellML models. This demonstration uses Fortran, see Python introduction to CellML in OpenCMISS-Iron for the corresponding Python example.
Following the usual Iron practices, you first need to declare the objects to be used in you application. For CellML, we would normally declare:
1 2 | TYPE(CMISSCellMLType) :: CellML
TYPE(CMISSFieldType) :: CellMLModelsField,CellMLStateField,CellMLIntermediateField,CellMLParametersField
|
which declares a single CellML environment that we will use and the fields...
And then we do some stuff:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | !Create the CellML environment
CALL CMISSCellML_Initialise(CellML,Err)
CALL CMISSCellML_CreateStart(CellMLUserNumber,Region,CellML,Err)
!Import the specified model into the CellML environment
CALL CMISSCellML_ModelImport(CellML,ModelUrl,modelIndex,Err)
! Now we have imported all the models we are able to specify which variables from the model we want:
! - to set from this side
CALL CMISSCellML_VariableSetAsKnown(CellML,modelIndex,"fast_sodium_current/g_Na ",Err)
CALL CMISSCellML_VariableSetAsKnown(CellML,modelIndex,"membrane/IStim",Err)
! - to get from the CellML side (state variables are wanted by default and can not be changed)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_K1",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_to",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_K",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_K_ATP",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_Ca_L_K",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_b_K",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_NaK",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_Na",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_b_Na",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_Ca_L_Na",Err)
CALL CMISSCellML_VariableSetAsWanted(CellML,modelIndex,"membrane/i_NaCa",Err)
! - and override constant parameters without needing to set up fields
!> \todo Need to allow parameter values to be overridden for the case when user has non-spatially varying parameter value.
! CALL CMISSDiagnosticsSetOff(Err)
!Finish the CellML environment
CALL CMISSCellML_CreateFinish(CellML,Err)
|
and on line 3 above you can see that this happens, and then on line 6 that is done.
We then do the actual field mapping:
1 2 3 4 5 6 7 8 9 10 11 | !Start the creation of CellML <--> OpenCMISS field maps
CALL CMISSCellML_FieldMapsCreateStart(CellML,Err)
!Now we can set up the field variable component <--> CellML model variable mappings.
!Map Vm - field to CellML
CALL CMISSCellML_CreateFieldToCellMLMap(CellML,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_VALUES_SET_TYPE, &
& modelIndex,"membrane/V",CMISS_FIELD_VALUES_SET_TYPE,Err)
! - and CellML to field
CALL CMISSCellML_CreateCellMLToFieldMap(CellML,modelIndex,"membrane/V",CMISS_FIELD_VALUES_SET_TYPE, &
& DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_VALUES_SET_TYPE,Err)
!Finish the creation of CellML <--> OpenCMISS field maps
CALL CMISSCellML_FieldMapsCreateFinish(CellML,Err)
|
and here you can see ...