Skip to main content

Initiate

Initiate an instance of ScalarMeshField_.

Inherited from AbstractMeshField

Initiate

Initiate an instance of AbstractMeshField_.

@ConstructorMethods

Interface 1 (Initiate by using param)

INTERFACE AbstractMeshFieldInitiate
MODULE SUBROUTINE Initiate1(obj, param, mesh)
CLASS(AbstractMeshField_), INTENT(INOUT) :: obj
TYPE(ParameterList_), INTENT(IN) :: param
TYPE(Mesh_), TARGET, INTENT(IN) :: mesh
END SUBROUTINE Initiate1
END INTERFACE AbstractMeshFieldInitiate

Interface 2 (Initiate by copying)

INTERFACE
MODULE SUBROUTINE Initiate2(obj, obj2, copyFull, copyStructure, &
& usePointer)
CLASS(AbstractMeshField_), INTENT(INOUT) :: obj
CLASS(AbstractMeshField_), INTENT(INOUT) :: obj2
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: copyFull
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: copyStructure
LOGICAL(LGT), OPTIONAL, INTENT(IN) :: usePointer
END SUBROUTINE Initiate2
END INTERFACE

Interface 3 (Initiate by AbstractMaterial)

INTERFACE
MODULE SUBROUTINE Initiate3(obj, mesh, material, name, engine)
CLASS(AbstractMeshField_), INTENT(INOUT) :: obj
!! AbstractMeshField
TYPE(Mesh_), TARGET, INTENT(IN) :: mesh
!! mesh
CLASS(AbstractMaterial_), INTENT(INOUT) :: material
!! Abstract material
CHARACTER(*), INTENT(IN) :: name
!! name of the AbstractMeshField
CHARACTER(*), INTENT(IN) :: engine
!! engine of the AbstractMeshField
END SUBROUTINE Initiate3
END INTERFACE

Interface 4 (Initiate by UserFunction)

INTERFACE
MODULE SUBROUTINE Initiate4(obj, mesh, func, name, engine, nnt)
CLASS(AbstractMeshField_), INTENT(INOUT) :: obj
!! AbstractMeshField
TYPE(Mesh_), TARGET, INTENT(IN) :: mesh
!! mesh
CLASS(UserFunction_), INTENT(INOUT) :: func
!! Abstract material
CHARACTER(*), INTENT(IN) :: name
!! name of the AbstractMeshField
CHARACTER(*), INTENT(IN) :: engine
!! engine of the AbstractMeshField
INTEGER(I4B), OPTIONAL, INTENT(IN) :: nnt
!! number of nodes in time
END SUBROUTINE Initiate4
END INTERFACE
  • Example 1 to Example 4 are related to the Initiate by using Parameters.
  • Example 6 and Example 7 are related to the Initiate by using UserFunction.

Example 1

Click here to see the example
!> author: Vikas Sharma, Ph. D.
! date: 2025-10-27
! summary: Testing initiate method for MeshField_Class

PROGRAM main
USE AbstractField_Class
USE AbstractMeshField_Class
USE MeshField_Class
USE FPL
USE GlobalData
USE FEDomain_Class
USE AbstractMesh_Class
USE ScalarField_Class
USE FEDOF_Class
USE AbstractFE_Class
USE Display_Method
USE ReallocateUtility, ONLY: Reallocate
USE FieldOpt_Class, ONLY: TypeFieldOpt
USE BaseType, ONLY: TypeFEVariableOpt, &
FEVariable_, &
TypeFEVariableVector, &
TypeFEVariableSpace, &
TypeInterpolationOpt
USE EngineOpt_Class, ONLY: TypeEngineOpt
USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION
USE FEVariable_Method, ONLY: NodalVariable, &
FEVariable_Set => Set

IMPLICIT NONE

TYPE(FEDomain_) :: dom
CLASS(AbstractMesh_), POINTER :: mesh
TYPE(MeshField_) :: obj
TYPE(FEVariable_) :: fevar
CHARACTER(*), PARAMETER :: tomlFileName = "./config.toml", &
engine = TypeEngineOpt%native_serial, &
myName = "main", &
modName = "_Initiate_test_1.F90"

INTEGER(I4B), PARAMETER :: nsd = 3, varType = TypeFEVariableOpt%Space, &
fieldType = TypeFieldOpt%normal, &
defineOn = TypeFieldOpt%nodal, &
order(3) = 9, &
ipType(3) = TypeInterpolationOpt%Equidistance
INTEGER(I4B) :: maxCon, tElements, iel, xij_i, xij_j, maxXijCon
REAL(DFP) :: elemCoord(3, 8)
REAL(DFP), ALLOCATABLE :: xij(:, :)
TYPE(FEDOF_) :: fedof, geofedof
TYPE(ScalarField_) :: u
CLASS(AbstractFE_), POINTER :: feptr

CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.)

CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain")
CALL u%ImportFromToml(fedof=fedof, geofedof=geofedof, dom=dom, &
fileName=tomlFileName, tomlName="u")

mesh => dom%GetMeshPointer()
tElements = mesh%GetTotalElements()
maxCon = fedof%GetMaxTotalConnectivity()
maxXijCon = 0

DO iel = 1, tElements
! CALL fedof%SetFE(globalElement=iel, islocal=.TRUE.)
feptr => fedof%GetFEPointer(globalElement=iel, islocal=.TRUE.)
xij_j = feptr%GetTotalInterpolationPoints(order=order, ipType=ipType)
maxXijCon = MAX(maxXijCon, xij_j)
END DO

CALL VectorMeshFieldInitiate( &
obj=obj, name="xij", fieldType=fieldType, varType=varType, &
engine=engine, defineOn=defineOn, spaceCompo=nsd, nns=maxXijCon, &
mesh=mesh)

CALL Reallocate(xij, 3, maxXijCon)
fevar = NodalVariable(val=xij, rank=TypeFEVariableVector, &
varType=TypeFEVariableSpace)

DO iel = 1, tElements
CALL fedof%SetFE(globalElement=iel, islocal=.TRUE.)

feptr => fedof%GetFEPointer(globalElement=iel, islocal=.TRUE.)

CALL feptr%GetInterpolationPoints( &
xij=elemCoord, ans=xij, nrow=xij_i, ncol=xij_j, order=order, &
ipType=ipType)

CALL FEVariable_Set( &
obj=fevar, val=xij(1:3, 1:xij_j), rank=TypeFEVariableVector, &
vartype=TypeFEVariableSpace, scale=1.0_DFP, addContribution=.FALSE.)

CALL obj%Insert(globalElement=iel, islocal=.TRUE., fevar=fevar)
END DO

CALL obj%Display(msg="MeshField info: ")

END PROGRAM main

Mesh info:

total nodes: 12
total elements: 14

The above code will initiate an instance of ScalarMeshField_, which will contain following data.

Object INITIATED: TRUE
name: aScalar
prefix: ScalarMeshField
fieldType: NORMAL
engine: NATIVE_SERIAL
tSize: 14
defineOn: Nodal
rank: Scalar
varType: Constant
shape:
---------------------------------
1
val ALLOCATED: TRUE
indxVal ALLOCATED: TRUE
mesh ASSOCIATED: TRUE
  • We have saved data in a one dimensional array val and indxVal. The size of indxVal is telements+1, i.e., 15.
  • The data for element iel will be stored in val(a:b), where a=indxVal(iel) and b=indxVal(iel+1)-1.
  • The number of data in each element will be 1, because, we have set varType=Constant. It means that data remains constant inside an element.
  • There are 14 elements in the mesh.

Example 2

Click here to see the example
  • fieldType = constant
  • varType = constant
PROGRAM main
USE HDF5File_Class
USE FEMesh_Class
USE AbstractField_Class
USE ScalarMeshField_Class
USE FPL
USE GlobalData

IMPLICIT NONE

TYPE(HDF5File_) :: meshfile
TYPE(FEMesh_) :: amesh
TYPE(ScalarMeshField_) :: obj
TYPE(ParameterList_) :: param
CHARACTER(*), PARAMETER :: filename="../../Mesh/examples/meshdata/small_mesh.h5"
INTEGER(I4B), PARAMETER :: nsd = 2

CALL meshfile%Initiate(fileName=filename, MODE="READ")
CALL meshfile%OPEN()
CALL amesh%Initiate(hdf5=meshfile, dim=nsd)

CALL amesh%DisplayMeshInfo("mesh info:")

CALL FPL_INIT(); CALL param%initiate()

CALL SetScalarMeshFieldParam(param=param, name='aScalar', &
varType=Constant, fieldType=TypeField%constant, &
engine='NATIVE_SERIAL', defineOn=Nodal, nns=6)

CALL obj%Initiate(param=param, mesh=amesh)

CALL obj%Display('obj: ')

CALL obj%DEALLOCATE()
CALL amesh%DEALLOCATE()
CALL meshfile%CLOSE()
CALL meshfile%DEALLOCATE()
CALL param%DEALLOCATE(); CALL FPL_FINALIZE()
END PROGRAM main

The above code will initiate an instance of ScalarMeshField_, which will contain following data.

Object INITIATED: TRUE
name: aScalar
prefix: ScalarMeshField
fieldType: CONSTANT
engine: NATIVE_SERIAL
tSize: 1
defineOn: Nodal
rank: Scalar
varType: Constant
val ALLOCATED: TRUE
indxVal ALLOCATED: TRUE
mesh ASSOCIATED: TRUE
shape:
---------------------------------
  • We have saved data in a one dimensional array val and indxVal. The size of indxVal is telements+1, i.e., 15.
  • The data for element iel will be stored in val(a:b), where a=indxVal(iel) and b=indxVal(iel+1)-1.
  • The number of data in each element will be 1, because, we have set varType=Constant. It means that data remains constant inside an element.
  • The size of val will be 1 because we have set fieldType=Constant.

Example 3

Click here to see the example
PROGRAM main
USE HDF5File_Class
USE FEMesh_Class
USE AbstractField_Class
USE ScalarMeshField_Class
USE FPL
USE GlobalData

IMPLICIT NONE

TYPE(HDF5File_) :: meshfile
TYPE(FEMesh_) :: amesh
TYPE(ScalarMeshField_) :: obj
TYPE(ParameterList_) :: param
CHARACTER(*), PARAMETER :: filename="../../Mesh/examples/meshdata/small_mesh.h5"
INTEGER(I4B), PARAMETER :: nsd = 2
INTEGER(I4B), PARAMETER :: varType = Space
INTEGER(I4B), PARAMETER :: fieldType = TypeField%normal

CALL meshfile%Initiate(fileName=filename, MODE="READ")
CALL meshfile%OPEN()
CALL amesh%Initiate(hdf5=meshfile, dim=nsd)

CALL amesh%DisplayMeshInfo("mesh info:")

CALL FPL_INIT(); CALL param%initiate()

CALL SetScalarMeshFieldParam(param=param, name='aScalar', &
varType=varType, fieldType=fieldType, &
engine='NATIVE_SERIAL', defineOn=Nodal, nns=6)

CALL obj%Initiate(param=param, mesh=amesh)

CALL obj%Display('obj: ')

CALL obj%DEALLOCATE()
CALL amesh%DEALLOCATE()
CALL meshfile%CLOSE()
CALL meshfile%DEALLOCATE()
CALL param%DEALLOCATE(); CALL FPL_FINALIZE()
END PROGRAM main
results
Object INITIATED: TRUE
name: aScalar
prefix: ScalarMeshField
fieldType: NORMAL
engine: NATIVE_SERIAL
tSize: 14
defineOn: Nodal
rank: Scalar
varType: Space
val ALLOCATED: TRUE
Size of val:84
indxVal ALLOCATED: TRUE
Size of indxVal:15
mesh ASSOCIATED: TRUE
shape:
---------------------------------
6
  • We have saved data in a one dimensional array val and indxVal. The size of indxVal is telements+1, i.e., 15.
  • The data for element iel will be stored in val(a:b), where a=indxVal(iel) and b=indxVal(iel+1)-1.
  • The number of data in each element will be 6. This is because, we have set varType=Constant, and defineOn=Nodal, and there specify nns=6. It means that inside an element the data changes with space.
  • There are 14 elements in the mesh, therefore, the total size of val will be 14*6=84

Example 4

Click here to see the example
PROGRAM main
USE HDF5File_Class
USE FEMesh_Class
USE AbstractField_Class
USE ScalarMeshField_Class
USE FPL
USE GlobalData

IMPLICIT NONE

TYPE(HDF5File_) :: meshfile
TYPE(FEMesh_) :: amesh
TYPE(ScalarMeshField_) :: obj
TYPE(ParameterList_) :: param
CHARACTER(*), PARAMETER :: filename="../../Mesh/examples/meshdata/small_mesh.h5"
INTEGER(I4B), PARAMETER :: nsd = 2
INTEGER(I4B), PARAMETER :: varType = Time
INTEGER(I4B), PARAMETER :: fieldType = TypeField%normal

CALL meshfile%Initiate(fileName=filename, MODE="READ")
CALL meshfile%OPEN()
CALL amesh%Initiate(hdf5=meshfile, dim=nsd)

CALL amesh%DisplayMeshInfo("mesh info:")

CALL FPL_INIT(); CALL param%initiate()

CALL SetScalarMeshFieldParam(param=param, name='aScalar', &
varType=varType, fieldType=fieldType, &
engine='NATIVE_SERIAL', defineOn=Nodal, nns=6)

CALL obj%Initiate(param=param, mesh=amesh)

CALL obj%Display('obj: ')

CALL obj%DEALLOCATE()
CALL amesh%DEALLOCATE()
CALL meshfile%CLOSE()
CALL meshfile%DEALLOCATE()
CALL param%DEALLOCATE(); CALL FPL_FINALIZE()
END PROGRAM main
results
Object INITIATED: TRUE
name: aScalar
prefix: ScalarMeshField
fieldType: NORMAL
engine: NATIVE_SERIAL
tSize: 14
defineOn: Nodal
rank: Scalar
varType: Time
val ALLOCATED: TRUE
Size of val:84
indxVal ALLOCATED: TRUE
Size of indxVal:15
mesh ASSOCIATED: TRUE
shape:
---------------------------------
6

Example 6

Click here to see the example
info

Initiate an instance of ScalarMeshField_ by using a UserFunction_. The user function is constant in this example.

PROGRAM main
USE HDF5File_Class
USE FEMesh_Class
USE AbstractField_Class
USE ScalarMeshField_Class
USE FPL
USE GlobalData
USE UserFunction_Class

IMPLICIT NONE

TYPE(HDF5File_) :: meshfile
TYPE(FEMesh_) :: amesh
TYPE(ScalarMeshField_) :: obj
TYPE(ParameterList_) :: param
TYPE(UserFunction_) :: func

CHARACTER(*), PARAMETER :: filename="../../Mesh/examples/meshdata/small_mesh.h5"
INTEGER(I4B), PARAMETER :: nsd = 2
INTEGER( I4B ), PARAMETER :: returnType = Scalar
INTEGER( I4B ), PARAMETER :: argType = Constant

CALL meshfile%Initiate(fileName=filename, MODE="READ")
CALL meshfile%OPEN()
CALL amesh%Initiate(hdf5=meshfile, dim=nsd)

CALL FPL_INIT(); CALL param%initiate()

CALL SetUserFunctionParam(param=param, name="func", returnType=returnType, &
argType=argType)

CALL func%Initiate(param)
CALL func%Set(scalarValue=2.0_DFP)
CALL obj%Initiate(mesh=amesh, func=func, name="func", engine="NATIVE_SERIAL")

CALL obj%DEALLOCATE()
CALL amesh%DEALLOCATE()
CALL meshfile%CLOSE()
CALL meshfile%DEALLOCATE()
CALL param%DEALLOCATE(); CALL FPL_FINALIZE()
END PROGRAM main

Example 7

Click here to see the example
info

This example shows how to initiate an instance of ScalarMeshField_ by using a UserFunction. The user function is space dependent in this example.

PROGRAM main
USE HDF5File_Class
USE FEMesh_Class
USE AbstractField_Class
USE ScalarMeshField_Class
USE FPL
USE GlobalData
USE UserFunction_Class

IMPLICIT NONE

TYPE(HDF5File_) :: meshfile
TYPE(FEMesh_) :: amesh
TYPE(ScalarMeshField_) :: obj
TYPE(ParameterList_) :: param
TYPE(UserFunction_) :: func

CHARACTER(*), PARAMETER :: filename="../../Mesh/examples/meshdata/small_mesh.h5"
INTEGER(I4B), PARAMETER :: nsd = 2
INTEGER(I4B), PARAMETER :: returnType = Scalar
INTEGER(I4B), PARAMETER :: argType = Space

CALL meshfile%Initiate(fileName=filename, MODE="READ")
CALL meshfile%OPEN()
CALL amesh%Initiate(hdf5=meshfile, dim=nsd)

CALL FPL_INIT(); CALL param%initiate()

CALL SetUserFunctionParam(param=param, name="func", returnType=returnType, &
argType=argType)

CALL func%Initiate(param)
CALL func%Set(scalarValue=2.0_DFP)
CALL obj%Initiate(mesh=amesh, func=func, name="func", engine="NATIVE_SERIAL")

CALL obj%DEALLOCATE()
CALL amesh%DEALLOCATE()
CALL meshfile%CLOSE()
CALL meshfile%DEALLOCATE()
CALL param%DEALLOCATE(); CALL FPL_FINALIZE()
END PROGRAM main