diff --git a/README.md b/README.md index 7d59e2be..ca82fdd2 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ First we need to configure our project by modyfing `docusaurus.config.js` file. - `organizationName`, The GitHub user or organization name. - `projectName`, The name of the deployment repository. -- `deploymentBranch`, The name of the deployment branch. Bu default it is `gh-pages` for non-organization GitHub pages repositories (that is, `projectName` not ending in `.github.io`). Otherwise, it needs to be explicit as a config field or environment variable. +- `deploymentBranch`, The name of the deployment branch. But default it is `gh-pages` for non-organization GitHub pages repositories (that is, `projectName` not ending in `.github.io`). Otherwise, it needs to be explicit as a config field or environment variable. In this repository we have set the following parameters in `docusaurus.config.js` file: diff --git a/docs/blog/DirichletBC/code/mesh/mesh.F90 b/docs/blog/DirichletBC/code/mesh/mesh.F90 new file mode 100644 index 00000000..65344f32 --- /dev/null +++ b/docs/blog/DirichletBC/code/mesh/mesh.F90 @@ -0,0 +1,88 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-02 +! summary: A Simple mesh generator + +PROGRAM main +USE Gmsh_Class +USE GlobalData +USE MSHFile_Class +USE HDF5File_Class +USE Display_Method + +TYPE(Gmsh_) :: gmsh + +CHARACTER(LEN=*), PARAMETER :: prefix = "square" +REAL(DFP), PARAMETER :: lx = 1.0_DFP +REAL(DFP), PARAMETER :: ly = 1.0_DFP +INTEGER(I4B), PARAMETER :: order = 1 + +REAL(DFP), PARAMETER :: meshSize = 1.0 +REAL(DFP), PARAMETER :: corner(3) = 0.0_DFP +INTEGER(I4B), PARAMETER :: nnod(2) = [3, 3] +INTEGER(I4B) :: ierr +REAL(DFP) :: x, y, z, lc +CHARACTER(:), ALLOCATABLE :: suffix, title + +TYPE(MSHFile_) :: mshFile +TYPE(HDF5File_) :: hdf5file + +suffix = ToString(nnod(1))//"x"//ToString(nnod(2)) + +title = prefix//"_"//suffix + +ierr = gmsh%Initialize() +ierr = gmsh%model%add(title) + +x = corner(1); y = corner(2); z = corner(3); lc = meshSize +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=1) + +x = x + lx; y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=2) + +x = x; y = y + ly; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=3) + +x = corner(1); y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=4) + +ierr = gmsh%model%geo%addLine(1, 2, 1) +ierr = gmsh%model%geo%addLine(2, 3, 2) +ierr = gmsh%model%geo%addLine(3, 4, 3) +ierr = gmsh%model%geo%addLine(4, 1, 4) + +ierr = gmsh%model%geo%addCurveLoop([1, 2, 3, 4], tag=1) + +ierr = gmsh%model%geo%addPlaneSurface([1], 1) + +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(1, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(3, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(2, nnod(2), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(4, nnod(2), & + "Progression", 1.0_DFP) + +ierr = gmsh%model%geo%mesh%setTransfiniteSurface(1) +ierr = gmsh%model%geo%mesh%setRecombine(2, 1) + +ierr = gmsh%model%geo%synchronize() + +ierr = gmsh%model%mesh%generate(2) + +ierr = gmsh%model%mesh%setOrder(order) + +ierr = gmsh%WRITE(title//'.msh') + +ierr = gmsh%Finalize() + +CALL mshFile%Initiate(filename=title//'.msh', STATUS="OLD", ACTION="READ") +CALL mshFile%OPEN() +CALL mshFile%READ() +CALL hdf5file%Initiate(title//'.h5', MODE="NEW") +CALL hdf5file%OPEN() +CALL mshFile%Export(hdf5=hdf5file, group="") +CALL mshFile%DEALLOCATE() +CALL hdf5file%DEALLOCATE() + +END PROGRAM main diff --git a/docs/blog/DirichletBC/code/mesh/runner.toml b/docs/blog/DirichletBC/code/mesh/runner.toml new file mode 100644 index 00000000..3ae3da27 --- /dev/null +++ b/docs/blog/DirichletBC/code/mesh/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/Blog/understanding-fedof/mesh/" +TargetLibs = ["easifemClasses"] diff --git a/docs/blog/DirichletBC/code/runner.toml b/docs/blog/DirichletBC/code/runner.toml new file mode 100644 index 00000000..a3fa3cce --- /dev/null +++ b/docs/blog/DirichletBC/code/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/Blog/DirichletBC/" +TargetLibs = ["easifemClasses"] diff --git a/docs/blog/DirichletBC/code/test1.F90 b/docs/blog/DirichletBC/code/test1.F90 new file mode 100644 index 00000000..30cf9313 --- /dev/null +++ b/docs/blog/DirichletBC/code/test1.F90 @@ -0,0 +1,104 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-23 +! summary: Study of DirichletBC class + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE DirichletBC_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE FEDOF_Class +USE ScalarField_Class +USE Display_Method +USE ReallocateUtility + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! Parameters +!---------------------------------------------------------------------------- +CHARACTER(*), PARAMETER :: tomlFileName = "./test1.toml" + +!---------------------------------------------------------------------------- +! Types and variables +!---------------------------------------------------------------------------- +TYPE(DirichletBC_) :: obj +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(FEDOF_) :: fedof, geofedof +INTEGER(I4B) :: tsize, iNodeOnNode, iNodeOnEdge, iNodeOnFace, nrow, ncol + +!---------------------------------------------------------------------------- +! Allocatables and pointers +!---------------------------------------------------------------------------- +CLASS(AbstractMesh_), POINTER :: cellMesh, boundaryMesh +INTEGER(I4B), ALLOCATABLE :: nodeNum(:) +REAL(DFP), ALLOCATABLE :: nodalValue(:, :) + +!---------------------------------------------------------------------------- +! Setting the verbosity +! In Debug mode, there will many messages printed to the screen +! Following code suppress information-exception. +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +!---------------------------------------------------------------------------- +! Domain: Initiate FEDomain and print info +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +! CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +!---------------------------------------------------------------------------- +! ScalarField and FEDOF: Initiate scalarField and fedof +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, geofedof=geofedof, dom=dom, & + filename=tomlFileName) +! CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Import from toml +!---------------------------------------------------------------------------- + +CALL obj%ImportFromToml(filename=tomlFileName, dom=dom, tomlName="dbc") +! CALL obj%Display("DirichletBC Info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the total node numbers +!---------------------------------------------------------------------------- +tsize = obj%GetTotalNodeNum(fedof=fedof) +CALL Display(tsize, "Total Node Num: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the node numbers +!---------------------------------------------------------------------------- + +CALL Reallocate(nodeNum, tsize, isExpand=.TRUE., expandFactor=2) +CALL obj%Get(fedof=fedof, nodeNum=nodeNum, tsize=tsize, & + iNodeOnNode=iNodeOnNode, iNodeOnEdge=iNodeOnEdge, & + iNodeOnFace=iNodeOnFace) +CALL Display(tsize, "tsize = ") +CALL Display(nodeNum(1:tsize), "nodeNum", full=.TRUE., orient="ROW") +CALL Display(iNodeOnNode, "iNodeOnNode = ") +CALL Display(iNodeOnFace, "iNodeOnFace = ") +CALL Display(iNodeOnEdge, "iNodeOnEdge = ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the nodal values +!---------------------------------------------------------------------------- + +CALL Reallocate(nodalValue, tsize, 2, isExpand=.TRUE., expandFactor=2) +CALL obj%Get(fedof=fedof, nodeNum=nodeNum, nodalValue=nodalValue, & + nrow=nrow, ncol=ncol) +CALL Display(nodalValue(1:nrow, 1:ncol), "nodalValue: ", & + full=.TRUE.) +CALL Display([nrow, ncol], "[nrow, ncol]: ") + +!---------------------------------------------------------------------------- +! Cleanup +!---------------------------------------------------------------------------- +CALL dom%DEALLOCATE() +END PROGRAM main diff --git a/docs/blog/DirichletBC/code/test1.toml b/docs/blog/DirichletBC/code/test1.toml new file mode 100644 index 00000000..55a1e383 --- /dev/null +++ b/docs/blog/DirichletBC/code/test1.toml @@ -0,0 +1,43 @@ +[domain] +filename = "./mesh/square_3x3.h5" +group = "/" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 4 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +[dbc] +name = "left_bottom_fix" +idof = 1 +nodalValueType = "Constant" +value = 10.0 +[dbc.boundary] +isSelectionByMeshID = true +[dbc.boundary.meshID] +line = [1, 4] diff --git a/docs/blog/DirichletBC/code/test2.F90 b/docs/blog/DirichletBC/code/test2.F90 new file mode 100644 index 00000000..e07e2166 --- /dev/null +++ b/docs/blog/DirichletBC/code/test2.F90 @@ -0,0 +1,111 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-23 +! summary: Study of DirichletBC class + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE DirichletBC_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE FEDOF_Class +USE ScalarField_Class +USE Display_Method +USE ReallocateUtility + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! Parameters +!---------------------------------------------------------------------------- +CHARACTER(*), PARAMETER :: tomlFileName = "./test2.toml" + +!---------------------------------------------------------------------------- +! Types and variables +!---------------------------------------------------------------------------- +TYPE(DirichletBC_) :: obj +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(FEDOF_) :: fedof, geofedof +INTEGER(I4B) :: tsize, iNodeOnNode, iNodeOnEdge, iNodeOnFace, nrow, ncol + +!---------------------------------------------------------------------------- +! Allocatables and pointers +!---------------------------------------------------------------------------- +CLASS(AbstractMesh_), POINTER :: cellMesh, boundaryMesh +INTEGER(I4B), ALLOCATABLE :: nodeNum(:) +REAL(DFP), ALLOCATABLE :: nodalValue(:, :) + +!---------------------------------------------------------------------------- +! Setting the verbosity +! In Debug mode, there will many messages printed to the screen +! Following code suppress information-exception. +!---------------------------------------------------------------------------- + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +!---------------------------------------------------------------------------- +! Domain: Initiate FEDomain and print info +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +! CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +!---------------------------------------------------------------------------- +! ScalarField and FEDOF: Initiate scalarField and fedof +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, geofedof=geofedof, dom=dom, & + filename=tomlFileName) +! CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Import from toml +!---------------------------------------------------------------------------- + +CALL obj%ImportFromToml(filename=tomlFileName, dom=dom, tomlName="dbc") +! CALL obj%Display("DirichletBC Info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the total node numbers +!---------------------------------------------------------------------------- +tsize = obj%GetTotalNodeNum(fedof=fedof) +CALL Display(tsize, "Total Node Num: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the node numbers +!---------------------------------------------------------------------------- + +CALL Reallocate(nodeNum, tsize, isExpand=.TRUE., expandFactor=2) +CALL obj%Get(fedof=fedof, nodeNum=nodeNum, tsize=tsize, & + iNodeOnNode=iNodeOnNode, iNodeOnEdge=iNodeOnEdge, & + iNodeOnFace=iNodeOnFace) +CALL Display(tsize, "tsize = ") +CALL Display(nodeNum(1:tsize), "nodeNum", full=.TRUE., orient="ROW") +CALL Display(iNodeOnNode, "iNodeOnNode = ") +CALL Display(iNodeOnFace, "iNodeOnFace = ") +CALL Display(iNodeOnEdge, "iNodeOnEdge = ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the nodal values +!---------------------------------------------------------------------------- + +CALL Reallocate(nodalValue, tsize, 2, isExpand=.TRUE., expandFactor=2) +CALL Display(SHAPE(nodalValue), "shape(nodalValue) before Get: ") +nrow = 0; ncol = 0 +CALL obj%Get(fedof=fedof, geofedof=geofedof, nodeNum=nodeNum, & + nodalValue=nodalValue, nrow=nrow, ncol=ncol) + +CALL Display(nodeNum(1:nrow), "nodeNum(1:nrow): ", & + full=.TRUE., advance="NO") +CALL Display(nodalValue(1:nrow, 1:ncol), "nodalValue: ", & + full=.TRUE.) +CALL Display([nrow, ncol], "[nrow, ncol]: ") + +!---------------------------------------------------------------------------- +! Cleanup +!---------------------------------------------------------------------------- + +CALL dom%DEALLOCATE() + +END PROGRAM main diff --git a/docs/blog/DirichletBC/code/test2.lua b/docs/blog/DirichletBC/code/test2.lua new file mode 100644 index 00000000..feb00b81 --- /dev/null +++ b/docs/blog/DirichletBC/code/test2.lua @@ -0,0 +1,3 @@ +function BottomFunc(x, y, z, t) + return x ^ 2 + y +end diff --git a/docs/blog/DirichletBC/code/test2.toml b/docs/blog/DirichletBC/code/test2.toml new file mode 100644 index 00000000..c0650dc9 --- /dev/null +++ b/docs/blog/DirichletBC/code/test2.toml @@ -0,0 +1,54 @@ +[domain] +filename = "./mesh/square_3x3.h5" +group = "/" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 4 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +[dbc] +name = "Bottom Space UserFunction" +idof = 1 +nodalValueType = "Space" +isUserFunction = true + +[dbc.function] +name = "func" +returnType = "Scalar" +numReturns = 1 +argType = "Space" +numArgs = 3 +luaScript = "test2.lua" +luaFunctionName = "BottomFunc" + +[dbc.boundary] +isSelectionByMeshID = true + +[dbc.boundary.meshID] +line = [1] diff --git a/docs/blog/DirichletBC/code/test200.toml b/docs/blog/DirichletBC/code/test200.toml new file mode 100644 index 00000000..c792dc85 --- /dev/null +++ b/docs/blog/DirichletBC/code/test200.toml @@ -0,0 +1,57 @@ +[domain] +filename = "./mesh/square_3x3.h5" +# meshfile name +group = "/" +# group name in meshfile where data for domain is stored +totalMedium = 1 +# total number of mediums attached to the domain + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 3 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +# [[u.dirichletBC]] +# name = "right_fix" +# idof = 1 +# nodalValueType = "Constant" +# value = 0.0 +# [u.dirichletBC.boundary] +# isSelectionByMeshID = true +# [u.dirichletBC.boundary.meshID] +# line = [1, 2, 3] + +# [[u.neumannBC]] +# name = "left" +# idof = 1 +# nodalValueType = "Space" +# isUserFunction = true +# [u.neumannBC.function] +# name="Function2" +# returnType="Scalar" +# numReturns=1 +# argType="Space" +# numArgs=3 +# luaScript = "./functions.lua" +# luaFunctionName="Function2" +# [u.neumannBC.boundary] +# isSelectionByMeshID = true +# [u.neumannBC.boundary.meshID] +# line = [4] diff --git a/docs/blog/DirichletBC/code/test3.F90 b/docs/blog/DirichletBC/code/test3.F90 new file mode 100644 index 00000000..d5d8eec4 --- /dev/null +++ b/docs/blog/DirichletBC/code/test3.F90 @@ -0,0 +1,111 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-23 +! summary: Study of DirichletBC class + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE DirichletBC_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE FEDOF_Class +USE ScalarField_Class +USE Display_Method +USE ReallocateUtility + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! Parameters +!---------------------------------------------------------------------------- +CHARACTER(*), PARAMETER :: tomlFileName = "./test3.toml" + +!---------------------------------------------------------------------------- +! Types and variables +!---------------------------------------------------------------------------- +TYPE(DirichletBC_) :: obj +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(FEDOF_) :: fedof, geofedof +INTEGER(I4B) :: tsize, iNodeOnNode, iNodeOnEdge, iNodeOnFace, nrow, ncol + +!---------------------------------------------------------------------------- +! Allocatables and pointers +!---------------------------------------------------------------------------- +CLASS(AbstractMesh_), POINTER :: cellMesh, boundaryMesh +INTEGER(I4B), ALLOCATABLE :: nodeNum(:) +REAL(DFP), ALLOCATABLE :: nodalValue(:, :) + +!---------------------------------------------------------------------------- +! Setting the verbosity +! In Debug mode, there will many messages printed to the screen +! Following code suppress information-exception. +!---------------------------------------------------------------------------- + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +!---------------------------------------------------------------------------- +! Domain: Initiate FEDomain and print info +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +! CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +!---------------------------------------------------------------------------- +! ScalarField and FEDOF: Initiate scalarField and fedof +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, geofedof=geofedof, dom=dom, & + filename=tomlFileName) +! CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Import from toml +!---------------------------------------------------------------------------- + +CALL obj%ImportFromToml(filename=tomlFileName, dom=dom, tomlName="dbc") +! CALL obj%Display("DirichletBC Info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the total node numbers +!---------------------------------------------------------------------------- +tsize = obj%GetTotalNodeNum(fedof=fedof) +CALL Display(tsize, "Total Node Num: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the node numbers +!---------------------------------------------------------------------------- + +CALL Reallocate(nodeNum, tsize, isExpand=.TRUE., expandFactor=2) +CALL obj%Get(fedof=fedof, nodeNum=nodeNum, tsize=tsize, & + iNodeOnNode=iNodeOnNode, iNodeOnEdge=iNodeOnEdge, & + iNodeOnFace=iNodeOnFace) +CALL Display(tsize, "tsize = ") +CALL Display(nodeNum(1:tsize), "nodeNum", full=.TRUE., orient="ROW") +CALL Display(iNodeOnNode, "iNodeOnNode = ") +CALL Display(iNodeOnFace, "iNodeOnFace = ") +CALL Display(iNodeOnEdge, "iNodeOnEdge = ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the nodal values +!---------------------------------------------------------------------------- + +CALL Reallocate(nodalValue, tsize, 2, isExpand=.TRUE., expandFactor=2) +CALL Display(SHAPE(nodalValue), "shape(nodalValue) before Get: ") +nrow = 0; ncol = 0 +CALL obj%Get(fedof=fedof, geofedof=geofedof, nodeNum=nodeNum, & + nodalValue=nodalValue, nrow=nrow, ncol=ncol) + +CALL Display(nodeNum(1:nrow), "nodeNum(1:nrow): ", & + full=.TRUE., advance="NO") +CALL Display(nodalValue(1:nrow, 1:ncol), "nodalValue: ", & + full=.TRUE.) +CALL Display([nrow, ncol], "[nrow, ncol]: ") + +!---------------------------------------------------------------------------- +! Cleanup +!---------------------------------------------------------------------------- + +CALL dom%DEALLOCATE() + +END PROGRAM main diff --git a/docs/blog/DirichletBC/code/test3.lua b/docs/blog/DirichletBC/code/test3.lua new file mode 100644 index 00000000..8b75f9d2 --- /dev/null +++ b/docs/blog/DirichletBC/code/test3.lua @@ -0,0 +1,3 @@ +function LeftFunc(x, y, z) + return y + y ^ 2 + y ^ 3 +end diff --git a/docs/blog/DirichletBC/code/test3.toml b/docs/blog/DirichletBC/code/test3.toml new file mode 100644 index 00000000..d34c40d3 --- /dev/null +++ b/docs/blog/DirichletBC/code/test3.toml @@ -0,0 +1,54 @@ +[domain] +filename = "./mesh/square_3x3.h5" +group = "/" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 4 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +[dbc] +name = "Left Space UserFunction" +idof = 1 +nodalValueType = "Space" +isUserFunction = true + +[dbc.function] +name = "func" +returnType = "Scalar" +numReturns = 1 +argType = "Space" +numArgs = 3 +luaScript = "test3.lua" +luaFunctionName = "LeftFunc" + +[dbc.boundary] +isSelectionByMeshID = true + +[dbc.boundary.meshID] +line = [4] diff --git a/docs/blog/DirichletBC/code/test4.F90 b/docs/blog/DirichletBC/code/test4.F90 new file mode 100644 index 00000000..810ab149 --- /dev/null +++ b/docs/blog/DirichletBC/code/test4.F90 @@ -0,0 +1,111 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-23 +! summary: Study of DirichletBC class + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE DirichletBC_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE FEDOF_Class +USE ScalarField_Class +USE Display_Method +USE ReallocateUtility + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! Parameters +!---------------------------------------------------------------------------- +CHARACTER(*), PARAMETER :: tomlFileName = "./test4.toml" + +!---------------------------------------------------------------------------- +! Types and variables +!---------------------------------------------------------------------------- +TYPE(DirichletBC_) :: obj +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(FEDOF_) :: fedof, geofedof +INTEGER(I4B) :: tsize, iNodeOnNode, iNodeOnEdge, iNodeOnFace, nrow, ncol + +!---------------------------------------------------------------------------- +! Allocatables and pointers +!---------------------------------------------------------------------------- +CLASS(AbstractMesh_), POINTER :: cellMesh, boundaryMesh +INTEGER(I4B), ALLOCATABLE :: nodeNum(:) +REAL(DFP), ALLOCATABLE :: nodalValue(:, :) + +!---------------------------------------------------------------------------- +! Setting the verbosity +! In Debug mode, there will many messages printed to the screen +! Following code suppress information-exception. +!---------------------------------------------------------------------------- + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +!---------------------------------------------------------------------------- +! Domain: Initiate FEDomain and print info +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +! CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +!---------------------------------------------------------------------------- +! ScalarField and FEDOF: Initiate scalarField and fedof +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, geofedof=geofedof, dom=dom, & + filename=tomlFileName) +! CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Import from toml +!---------------------------------------------------------------------------- + +CALL obj%ImportFromToml(filename=tomlFileName, dom=dom, tomlName="dbc") +! CALL obj%Display("DirichletBC Info: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the total node numbers +!---------------------------------------------------------------------------- +tsize = obj%GetTotalNodeNum(fedof=fedof) +CALL Display(tsize, "Total Node Num: ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the node numbers +!---------------------------------------------------------------------------- + +CALL Reallocate(nodeNum, tsize, isExpand=.TRUE., expandFactor=2) +CALL obj%Get(fedof=fedof, nodeNum=nodeNum, tsize=tsize, & + iNodeOnNode=iNodeOnNode, iNodeOnEdge=iNodeOnEdge, & + iNodeOnFace=iNodeOnFace) +CALL Display(tsize, "tsize = ") +CALL Display(nodeNum(1:tsize), "nodeNum", full=.TRUE., orient="ROW") +CALL Display(iNodeOnNode, "iNodeOnNode = ") +CALL Display(iNodeOnFace, "iNodeOnFace = ") +CALL Display(iNodeOnEdge, "iNodeOnEdge = ") + +!---------------------------------------------------------------------------- +! DirichletBC: Get the nodal values +!---------------------------------------------------------------------------- + +CALL Reallocate(nodalValue, tsize, 2, isExpand=.TRUE., expandFactor=2) +CALL Display(SHAPE(nodalValue), "shape(nodalValue) before Get: ") +nrow = 0; ncol = 0 +CALL obj%Get(fedof=fedof, geofedof=geofedof, nodeNum=nodeNum, & + nodalValue=nodalValue, nrow=nrow, ncol=ncol) + +CALL Display(nodeNum(1:nrow), "nodeNum(1:nrow): ", & + full=.TRUE., advance="NO") +CALL Display(nodalValue(1:nrow, 1:ncol), "nodalValue: ", & + full=.TRUE.) +CALL Display([nrow, ncol], "[nrow, ncol]: ") + +!---------------------------------------------------------------------------- +! Cleanup +!---------------------------------------------------------------------------- + +CALL dom%DEALLOCATE() + +END PROGRAM main diff --git a/docs/blog/DirichletBC/code/test4.lua b/docs/blog/DirichletBC/code/test4.lua new file mode 100644 index 00000000..2c27147d --- /dev/null +++ b/docs/blog/DirichletBC/code/test4.lua @@ -0,0 +1,3 @@ +function BottomFunc(x, y, z) + return x ^ 2 + y +end diff --git a/docs/blog/DirichletBC/code/test4.toml b/docs/blog/DirichletBC/code/test4.toml new file mode 100644 index 00000000..a634eb5c --- /dev/null +++ b/docs/blog/DirichletBC/code/test4.toml @@ -0,0 +1,54 @@ +[domain] +filename = "./mesh/square_3x3.h5" +group = "/" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 4 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +[dbc] +name = "Bottom Space UserFunction" +idof = 1 +nodalValueType = "Space" +isUserFunction = true + +[dbc.function] +name = "func" +returnType = "Scalar" +numReturns = 1 +argType = "Space" +numArgs = 3 +luaScript = "test2.lua" +luaFunctionName = "BottomFunc" + +[dbc.boundary] +isSelectionByMeshID = true + +[dbc.boundary.meshID] +line = [1] diff --git a/docs/blog/DirichletBC/figures/order4_mesh3x3.svg b/docs/blog/DirichletBC/figures/order4_mesh3x3.svg new file mode 100644 index 00000000..1a2a48d3 --- /dev/null +++ b/docs/blog/DirichletBC/figures/order4_mesh3x3.svg @@ -0,0 +1,731 @@ + + + + + + + + + + + + 78 + + + + + 80 + + + + + 81 + + + + + 79 + + + + + 76 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + + + + 73 + + + + + 77 + + + + + 74 + + + + + 42 + + + + + 41 + + + + + 40 + + + + + 45 + + + + + 44 + + + + + 43 + + + + + 75 + + + + + + + + + + 69 + + + + + 71 + + + + + 72 + + + + + 70 + + + + + 67 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 33 + + + + + 32 + + + + + 2 + + + + + 6 + + + + + 31 + + + + + 64 + + + + + 68 + + + + + 65 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 39 + + + + + 38 + + + + + 37 + + + + + 66 + + + + + + + + + + 60 + + + + + 62 + + + + + 63 + + + + + 61 + + + + + 58 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + 4 + + + + + 55 + + + + + 59 + + + + + 56 + + + + + 24 + + + + + 23 + + + + + 22 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + 30 + + + + + 29 + + + + + 28 + + + + + 57 + + + + + + + + + + 51 + + + + + 53 + + + + + 54 + + + + + 52 + + + + + 49 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 10 + + + + + 11 + + + + + 5 + + + + + 9 + + + + + 8 + + + + + 12 + + + + + 46 + + + + + 50 + + + + + 47 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 48 + + + + diff --git a/docs/blog/DirichletBC/figures/square_3x3.svg b/docs/blog/DirichletBC/figures/square_3x3.svg new file mode 100644 index 00000000..79f56f17 --- /dev/null +++ b/docs/blog/DirichletBC/figures/square_3x3.svg @@ -0,0 +1,46 @@ + + +square_3x3 + +Creator: GL2PS 1.4.3, (C) 1999-2020 C. Geuzaine +For: Gmsh +CreationDate: Thu Oct 2 14:22:38 2025 + + + + + + + + + + + + + + + + +13 +14 +15 +16 + + + + + + +1 +2 +3 +4 +5 +6 +7 +8 +9 + + diff --git a/docs/blog/DirichletBC/understanding-dirichletbc-1.md b/docs/blog/DirichletBC/understanding-dirichletbc-1.md new file mode 100644 index 00000000..9f149ea7 --- /dev/null +++ b/docs/blog/DirichletBC/understanding-dirichletbc-1.md @@ -0,0 +1,138 @@ +--- +title: Handling Dirichlet Bounding Conditions in easifem (Part 1) +description: This post explains concept of FEDOF in easifem. +authors: + - vickysharma0812 +tags: [mesh, fedof, dirichletBC] +hide_table_of_contents: false +--- + +## Introduction + +To apply boundary condition in FEM computation, EASIFEM, provides a class called [DirichletBC_](/docs-api/DirichletBC/DirichletBC_). + +:::info +`DirichletBC_` is a subclass of [AbstractBC](/docs-api/AbstractBC). +::: + +To understand how `DirichletBC` works, lets consider an example of linear elasticity. Let's say we want to apply the following boundary condition. + +$$ +\mathbf{u} = \mathbf{U}_{0}, \text{ on } \Gamma +$$ + +We may think that there is only one boundary condition. But in easifem this is not the case. Actually, $\mathbf{u}$, has three components in 3D (and two components in 2D). Therefore, the above boundary condition is actually boundary condition for $u_x$, $u_y$, and $u_z$. So, we have three boundary condition on a given boundary $\Gamma$. + + + +The second point, which is quite obvious, is that every boundary condition has two things: + +- The boundary +- The value (condition) + +To define the boundary EASIFEM employs the [MeshSelection](/docs-api/MeshSelection) class. The value can be specified in several ways as mentioned below in this section. + +:::note +Several instances of DirichletBC can have same boundary but different condition. +::: + +## Mesh and degrees of freedom + +![Degree of freedom in mesh](./figures/order4_mesh3x3.svg) + +## Import from toml + +We can initiate an instance of `DirichletBC_` by importing the information from a toml-file. To do so, we will use the method called [ImportFromToml](/docs-api/AbstractBC/ImportFromToml). + +Let us consider the following toml file + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./code/test1.toml'; + +{CodeSnippet} + +We use the following code to import the boundary condition from the above toml file. + +import FortranCodeSnippet from '!!raw-loader!./code/test1.F90'; + +{FortranCodeSnippet} + +We obtain the following information about the boundary condition. + +| Property | Value | +| -------------------- | --------------- | +| isInit | TRUE | +| name | left_bottom_fix | +| idof | 1 | +| nodalValueType | CONSTANT | +| isUserFunction | FALSE | +| isUseExternal | FALSE | +| IsInitiated | TRUE | +| IsSelectionByMeshID | TRUE | +| IsSelectionByElemNum | FALSE | +| IsSelectionByNodeNum | FALSE | +| IsSelectionByBox | FALSE | +| MeshID Point | FALSE | +| MeshID Curve | TRUE | +| MeshID Surface | FALSE | +| MeshID Volume | FALSE | +| ElemNum Point | FALSE | +| ElemNum Curve | FALSE | +| ElemNum Surface | FALSE | +| ElemNum Volume | FALSE | +| NodeNum Point | FALSE | +| NodeNum Curve | FALSE | +| NodeNum Surface | FALSE | +| NodeNum Volume | FALSE | +| Box Point | FALSE | +| Box Curve | FALSE | +| Box Surface | FALSE | +| Box Volume | FALSE | + +## Getting Total Node Numbers + +To get the total number of nodes where the boundary condition is applied, we can use the method called [GetTotalNodeNum](/docs-api/AbstractBC/GetTotalNodeNum). + +```fortran +CALL Display(obj%GetTotalNodeNum(fedof=fedof), "Total Node Num: ") +``` + +:::info Results +Total Node Num: 18 +::: + +There is a total of 18 nodes where the boundary condition is applied. Actually, node number 1 is counted two times because it is common to bottom and left boundaries. + +## Getting Node Numbers + +To get the node numbers we call [Get](/docs-api/AbstractBC/Get) method. These node numbers are degrees of freedom numbers for FEDOF. You can use these indices to set and get the values in node fields. + +```fortran +CALL obj%Get(fedof=fedof, nodeNum=nodeNum, tsize=tsize, & + iNodeOnNode=iNodeOnNode, iNodeOnEdge=iNodeOnEdge, & + iNodeOnFace=iNodeOnFace) +CALL Display(tsize, "tsize = ") +CALL Display(nodeNum(1:tsize), "nodeNum", full=.TRUE., orient="ROW") +CALL Display(iNodeOnNode, "iNodeOnNode = ") +CALL Display(iNodeOnFace, "iNodeOnFace = ") +CALL Display(iNodeOnEdge, "iNodeOnEdge = ") +``` + +:::info Results + +```txt + nodeNum +---------------------------------------------------------------------- + 1 5 2 4 8 1 10 11 12 31 32 33 28 29 30 19 20 21 + +iNodeOnNode = 1 +iNodeOnFace = 7 +iNodeOnEdge = 19 +``` + +- Node number 1 to 6 (7-1) are vertex dof numbers. +- Node number 7 to 18 (19-1) are face dof numbers +- Node number 19 to 18 are edge dof numbers (There are no edges) + +::: diff --git a/docs/blog/DirichletBC/understanding-dirichletbc-2.md b/docs/blog/DirichletBC/understanding-dirichletbc-2.md new file mode 100644 index 00000000..c3e48ee5 --- /dev/null +++ b/docs/blog/DirichletBC/understanding-dirichletbc-2.md @@ -0,0 +1,122 @@ +--- +title: Handling Dirichlet Bounding Conditions in easifem (Part 2) +description: This post explains concept of Dirichlet Boundary Condition in EASIFEM +authors: + - vickysharma0812 +tags: [mesh, fedof, dirichletBC] +hide_table_of_contents: false +--- + +## Introduction + +:::note + +Before reading this post, it is recommended to read [Handling Dirichlet Bounding Conditions in easifem (Part 1)](./understanding-dirichletbc-1.md) first. + +::: + +In this example, Dirichlet boundary conditions is given by a user defined function. + +## Mesh and degrees of freedom + +![Degree of freedom in mesh](./figures/order4_mesh3x3.svg) + + + +## Import from toml + +We can initiate an instance of `DirichletBC_` by importing the information from a toml-file. To do so, we will use the method called [ImportFromToml](/docs-api/AbstractBC/ImportFromToml). + +Let us consider the following toml file + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./code/test2.toml'; + +{CodeSnippet} + +We use the following code to import the boundary condition from the above toml file. + +import FortranCodeSnippet from '!!raw-loader!./code/test2.F90'; + +{FortranCodeSnippet} + +We obtain the following information about the boundary condition. + +:::info Results + +#### DirichletBC Info + +| Property | Value | +| -------------- | ------------------------- | +| isInit | TRUE | +| name | Bottom Space UserFunction | +| idof | 1 | +| nodalValueType | SPACE | +| isUserFunction | TRUE | +| isUseExternal | FALSE | + +#### Boundary + +| Property | Value | +| -------------------- | ----- | +| IsInitiated | TRUE | +| IsSelectionByMeshID | TRUE | +| IsSelectionByElemNum | FALSE | +| IsSelectionByNodeNum | FALSE | +| IsSelectionByBox | FALSE | + +#### Allocation Status + +| Element Type | Point | Curve | Surface | Volume | +| ----------------- | ----- | ----- | ------- | ------ | +| MeshID ALLOCATED | FALSE | TRUE | FALSE | FALSE | +| ElemNum ALLOCATED | FALSE | FALSE | FALSE | FALSE | +| NodeNum ALLOCATED | FALSE | FALSE | FALSE | FALSE | +| Box ALLOCATED | FALSE | FALSE | FALSE | FALSE | + +::: + +## Getting Total Node Numbers + +To get the total number of nodes where the boundary condition is applied, we can use the method called [GetTotalNodeNum](/docs-api/AbstractBC/GetTotalNodeNum). + +```fortran +CALL Display(obj%GetTotalNodeNum(fedof=fedof), "Total Node Num: ") +``` + +:::info Results +Total Node Num: 9 +::: + +## Getting Node Numbers + +To get the node numbers we call [Get](/docs-api/AbstractBC/Get) method. These node numbers are degrees of freedom numbers for FEDOF. You can use these indices to set and get the values in node fields. + +```fortran +CALL obj%Get(fedof=fedof, nodeNum=nodeNum, tsize=tsize, & + iNodeOnNode=iNodeOnNode, iNodeOnEdge=iNodeOnEdge, & + iNodeOnFace=iNodeOnFace) +CALL Display(tsize, "tsize = ") +CALL Display(nodeNum(1:tsize), "nodeNum", full=.TRUE., orient="ROW") +CALL Display(iNodeOnNode, "iNodeOnNode = ") +CALL Display(iNodeOnFace, "iNodeOnFace = ") +CALL Display(iNodeOnEdge, "iNodeOnEdge = ") +``` + +:::info Results + +```txt + nodeNum +---------------------------------- + 1 5 2 10 11 12 31 32 33 + +iNodeOnNode = 1 +iNodeOnFace = 4 +iNodeOnEdge = 10 +``` + +- Node number 1 to 3 are vertex dof numbers. +- Node number 4 to 9 are face dof numbers + +::: diff --git a/docs/blog/DirichletBC/understanding-dirichletbc-3.md b/docs/blog/DirichletBC/understanding-dirichletbc-3.md new file mode 100644 index 00000000..3b39f465 --- /dev/null +++ b/docs/blog/DirichletBC/understanding-dirichletbc-3.md @@ -0,0 +1,228 @@ +--- +title: Handling Dirichlet Bounding Conditions in easifem (Part 1) +description: This post explains concept of FEDOF in easifem. +authors: + - vickysharma0812 +tags: [mesh, fedof, dirichletBC] +hide_table_of_contents: false +--- + +## Introduction + +To apply boundary condition in FEM computation, EASIFEM, provides a class called [DirichletBC_](/docs-api/DirichletBC/DirichletBC_). + +:::info +`DirichletBC_` is a subclass of [AbstractBC](/docs-api/AbstractBC). +::: + +To understand how `DirichletBC` works, lets consider an example of linear elasticity. Let's say we want to apply the following boundary condition. + +$$ +\mathbf{u} = \mathbf{U}_{0}, \text{ on } \Gamma +$$ + +We may think that there is only one boundary condition. But in easifem this is not the case. Actually, $\mathbf{u}$, has three components in 3D (and two components in 2D). Therefore, the above boundary condition is actually boundary condition for $u_x$, $u_y$, and $u_z$. So, we have three boundary condition on a given boundary $\Gamma$. + + + +The second point, which is quite obvious, is that every boundary condition has two things: + +- The boundary +- The value (condition) + +To define the boundary EASIFEM employs the [MeshSelection](/docs-api/MeshSelection) class. The value can be specified in several ways as mentioned below in this section. + +:::note +Several instances of DirichletBC can have same boundary but different condition. +::: + +## Import from toml + +We can initiate an instance of `DirichletBC_` by importing the information from a toml-file. To do so, we will use the method called [ImportFromToml](/docs-api/AbstractBC/ImportFromToml). + +Let us consider the following toml file + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./code/test1.toml'; + +{CodeSnippet} + +We use the following code to import the boundary condition from the above toml file. + +import FortranCodeSnippet from '!!raw-loader!./code/test1.F90'; + +{FortranCodeSnippet} + +## Learn from example + +Let's consider the following example, in which we will specify the constant boundary condition. + +
+Click here to see the example +
+ +```fortran +PROGRAM main +USE easifemBase +USE easifemClasses +IMPLICIT NONE + +TYPE(DirichletBC_) :: obj +TYPE(MeshSelection_) :: boundary +TYPE(ParameterList_) :: param +TYPE(Domain_) :: dom +TYPE(HDF5File_) :: domainfile +CHARACTER(*), PARAMETER :: domainfilename = "./mesh3D.h5" +INTEGER(I4B) :: bottom = 1, top = 2, left = 3, right = 4, & + front = 5, behind = 6, nsd +INTEGER(I4B), ALLOCATABLE :: nodeNum(:) +REAL(DFP), ALLOCATABLE :: nodalValue(:, :) + +CALL FPL_Init; CALL param%Initiate() +CALL domainfile%Initiate(filename=domainfilename, mode="READ") +CALL domainfile%OPEN() +CALL dom%Initiate(domainfile, group="") + +nsd = dom%GetNSD() + +! We call Set SetAbstractBCParam to set the parameter for boundary condition +CALL SetAbstractBCParam(param=param, prefix=obj%GetPrefix(), & + & name="ZeroBC", idof=1, nodalValueType=Constant) + +! We call SetMeshSelectionParam to set the parameter for boundary condition +CALL SetMeshSelectionParam(param=param, prefix=boundary%GetPrefix(), & + & isSelectionByMeshID=.TRUE.) + +CALL boundary%Initiate(param) + +CALL boundary%Add(dom=dom, dim=nsd - 1, meshID=[top]) +CALL boundary%Set() + +CALL obj%Initiate(param=param, boundary=boundary, dom=dom) + +CALL obj%Set(constantNodalValue=0.0_DFP) + +CALL obj%Get(nodeNum=nodeNum, nodalValue=nodalValue) + +CALL Display(nodeNum, "nodeNum", advance="NO") +CALL Display(nodalValue, "nodalValue", advance="YES") + +CALL domainfile%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL param%DEALLOCATE(); CALL FPL_Finalize +END PROGRAM main +``` + +
+
+ +In the above code, to define the boundary condition, we follow the steps given below. + +### Step 1: Set the properties of the DirichletBC + +We set the properties of `DirichletBC_` by using the method called [SetAbstractBCParam](/docs-api/AbstractBC/SetAbstractBCParam). + +```fortran +CALL SetAbstractBCParam(param=param, prefix=obj%GetPrefix(), & + & name="ZeroBC", idof=1, nodalValueType=Constant) +``` + +:::note +Because we are setting constant boundary condition, we used `nodalValueType=Constant`. +::: + +You can learn more about this method [here](/docs-api/AbstractBC/SetAbstractBCParam). + +### Step 2: Define a boundary + +To define a boundary we will use the [MeshSelection](/docs-api/MeshSelection). In the above code, we select the boundary by specifing the `meshID`. + +```fortran +CALL SetMeshSelectionParam(param=param, prefix=boundary%GetPrefix(), & + & isSelectionByMeshID=.TRUE.) +``` + +After setting the boundary parameter we call [Initiate](/docs-api/MeshSelection/Initiate) method. + +```fortran +CALL boundary%Initiate(param) +``` + +Subsequently, we call `Add` method to add the information of `meshID`. + +```fortran +CALL boundary%Add(dom=dom, dim=nsd - 1, meshID=[top]) +CALL boundary%Set() +``` + +:::info +After adding the information of meshID we should call [Set](/docs-api/MeshSelection/Set) method, which means that we are done adding information to the boundary. +::: + +You can learn more about `SetMeshSelectionParam` [here](/docs-api/MeshSelection/SetMeshSelectionParam) + +### Step 3: Initiate instance of `DirichletBC` + +After initiating the boundary, call [Initiate](/docs-api/AbstractBC/Initiate). To initiate an instance of `DirichletBC_` we need to pass the boundary, paramters, and domain. + +```fortran +CALL obj%Initiate(param=param, boundary=boundary, dom=dom) +``` + +### Step 4: Set the boundary condition + +After initiating an instance of `DirichletBC_`, next step is to set the boundary condition. To do so, we will use the method [Set](/docs-api/AbstractBC/Set). + +While setting the value we should respect the configuration used while calling `SetAbstractBCParam`. For example, in the above example we configure boundary condition for `nodalValueType=Constant`. Therefore, we should set the `constantNodalValue` while calling the set method. + +```fortran +CALL obj%Set(constantNodalValue=0.0_DFP) +``` + +### Step 5: Get the value of boundary condition + +To get the boundary condition we will use the method [Get](/docs-api/AbstractBC/Get). The Get function can take two arguments `nodeNum(:)` and `nodalValue(:,:)`. The `nodeNum(:)` is compulsory, whereas `nodalValue` can be optional. + +```fortran +CALL obj%Get(nodeNum=nodeNum, nodalValue=nodalValue) +``` + +:::note +On return, the size of `nodeNum` and `SIZE(nodalValue, 1)` is same. +::: + +The columns in `nodalValue` denotes the boundary condition at different times. You can read more about this subroutine [here](/docs-api/AbstractBC/Get). + +## Further reading + +There is more to `DirichletBC_`, and you can learn about them from following pages. (Here `DBC` stands for `DirichletBC_`) + + + + + + + + + diff --git a/docs/blog/FEDOF/code/mesh/mesh.F90 b/docs/blog/FEDOF/code/mesh/mesh.F90 new file mode 100644 index 00000000..65344f32 --- /dev/null +++ b/docs/blog/FEDOF/code/mesh/mesh.F90 @@ -0,0 +1,88 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-02 +! summary: A Simple mesh generator + +PROGRAM main +USE Gmsh_Class +USE GlobalData +USE MSHFile_Class +USE HDF5File_Class +USE Display_Method + +TYPE(Gmsh_) :: gmsh + +CHARACTER(LEN=*), PARAMETER :: prefix = "square" +REAL(DFP), PARAMETER :: lx = 1.0_DFP +REAL(DFP), PARAMETER :: ly = 1.0_DFP +INTEGER(I4B), PARAMETER :: order = 1 + +REAL(DFP), PARAMETER :: meshSize = 1.0 +REAL(DFP), PARAMETER :: corner(3) = 0.0_DFP +INTEGER(I4B), PARAMETER :: nnod(2) = [3, 3] +INTEGER(I4B) :: ierr +REAL(DFP) :: x, y, z, lc +CHARACTER(:), ALLOCATABLE :: suffix, title + +TYPE(MSHFile_) :: mshFile +TYPE(HDF5File_) :: hdf5file + +suffix = ToString(nnod(1))//"x"//ToString(nnod(2)) + +title = prefix//"_"//suffix + +ierr = gmsh%Initialize() +ierr = gmsh%model%add(title) + +x = corner(1); y = corner(2); z = corner(3); lc = meshSize +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=1) + +x = x + lx; y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=2) + +x = x; y = y + ly; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=3) + +x = corner(1); y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=4) + +ierr = gmsh%model%geo%addLine(1, 2, 1) +ierr = gmsh%model%geo%addLine(2, 3, 2) +ierr = gmsh%model%geo%addLine(3, 4, 3) +ierr = gmsh%model%geo%addLine(4, 1, 4) + +ierr = gmsh%model%geo%addCurveLoop([1, 2, 3, 4], tag=1) + +ierr = gmsh%model%geo%addPlaneSurface([1], 1) + +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(1, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(3, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(2, nnod(2), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(4, nnod(2), & + "Progression", 1.0_DFP) + +ierr = gmsh%model%geo%mesh%setTransfiniteSurface(1) +ierr = gmsh%model%geo%mesh%setRecombine(2, 1) + +ierr = gmsh%model%geo%synchronize() + +ierr = gmsh%model%mesh%generate(2) + +ierr = gmsh%model%mesh%setOrder(order) + +ierr = gmsh%WRITE(title//'.msh') + +ierr = gmsh%Finalize() + +CALL mshFile%Initiate(filename=title//'.msh', STATUS="OLD", ACTION="READ") +CALL mshFile%OPEN() +CALL mshFile%READ() +CALL hdf5file%Initiate(title//'.h5', MODE="NEW") +CALL hdf5file%OPEN() +CALL mshFile%Export(hdf5=hdf5file, group="") +CALL mshFile%DEALLOCATE() +CALL hdf5file%DEALLOCATE() + +END PROGRAM main diff --git a/docs/blog/FEDOF/code/mesh/runner.toml b/docs/blog/FEDOF/code/mesh/runner.toml new file mode 100644 index 00000000..3ae3da27 --- /dev/null +++ b/docs/blog/FEDOF/code/mesh/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/Blog/understanding-fedof/mesh/" +TargetLibs = ["easifemClasses"] diff --git a/docs/blog/FEDOF/code/runner.toml b/docs/blog/FEDOF/code/runner.toml new file mode 100644 index 00000000..98f203be --- /dev/null +++ b/docs/blog/FEDOF/code/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/Blog/understanding-fedof/" +TargetLibs = ["easifemClasses"] diff --git a/docs/blog/FEDOF/code/test1.F90 b/docs/blog/FEDOF/code/test1.F90 new file mode 100644 index 00000000..20ae8b9c --- /dev/null +++ b/docs/blog/FEDOF/code/test1.F90 @@ -0,0 +1,198 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-02 +! summary: See test1.toml + +PROGRAM main +USE GlobalData, ONLY: DFP, LGT, I4B +USE AbstractMesh_Class +USE FEDomain_Class +USE HDF5File_Class +USE ScalarField_Class +USE FEDOF_Class +USE Display_Method +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! parameters +!---------------------------------------------------------------------------- + +CHARACTER(*), PARAMETER :: tomlFileName = "./test1.toml" +LOGICAL(LGT), PARAMETER :: yes = .TRUE., no = .FALSE. + +!---------------------------------------------------------------------------- +! variables +!---------------------------------------------------------------------------- + +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(FEDOF_) :: fedof +INTEGER(I4B) :: nrow, ncol + +!---------------------------------------------------------------------------- +! pointer and allocatables +!---------------------------------------------------------------------------- +CLASS(AbstractMesh_), POINTER :: cellMesh => NULL(), boundaryMesh => NULL() +INTEGER(I4B), ALLOCATABLE :: con(:), orient(:, :) + +!---------------------------------------------------------------------------- +! Setting the verbosity +! In Debug mode, there will many messages printed to the screen +! Following code suppress information-exception. +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +!---------------------------------------------------------------------------- +! Domain and Mesh Related +! Initiate FEDomain and get cell mesh pointer +! The cell mesh pointer contains the element of highest spatial dimension. +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +cellMesh => dom%GetMeshPointer() +CALL cellMesh%DisplayMeshInfo(msg="Cell Mesh Info:") + +!---------------------------------------------------------------------------- +! mesh: Get maximum number of nodes in a cell mesh +!---------------------------------------------------------------------------- + +! Get the maximum number of nodes in a cell mesh +CALL Display(cellMesh%GetMaxNNE(), "maxNNE in cellMesh: ") + +!---------------------------------------------------------------------------- +! mesh: Getting the total entities in an element of mesh +!---------------------------------------------------------------------------- +con = cellMesh%GetTotalEntities(globalElement=1, islocal=yes) +CALL Display(con, "Total entities for localElement=1: ") +! 4, 0, 4, 1 + +!---------------------------------------------------------------------------- +! mesh: Getting the connectivity of vertices +!---------------------------------------------------------------------------- + +CALL Display(cellMesh%GetGlobalElemNumber(localElement=1), & + "Global element number for localElement=1:") +con = cellMesh%GetConnectivity(globalElement=1, islocal=yes, opt="V") +CALL Display(con, "Connectivity of vertices for globalElement=1: ") + +!---------------------------------------------------------------------------- +! mesh: Getting the face connectivity +!---------------------------------------------------------------------------- + +CALL Display(cellMesh%GetTotalFaces(), "Total faces in mesh:") +con = cellMesh%GetConnectivity(globalElement=1, islocal=yes, opt="F") +CALL Display(con, "Connectivity of faces for localElement=1: ") + +!---------------------------------------------------------------------------- +! mesh: Getting the face orientation +!---------------------------------------------------------------------------- + +CALL Reallocate(orient, 3, SIZE(con)) +CALL cellMesh%GetFaceOrientation(globalElement=1, islocal=yes, ans=orient, & + nrow=nrow, ncol=ncol) +CALL Display(orient(1:nrow, 1:ncol), & + "Face orientations for localElement=1: ") + +!---------------------------------------------------------------------------- +! mesh: Getting the node numbers of a face +! To get the node numbers of a face we need describe the globalElement +! and the local face number +!---------------------------------------------------------------------------- + +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=1, islocal=yes) +CALL Display(con, "Node numbers of face 1 of element 1: ") + +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=2, islocal=yes) +CALL Display(con, "Node numbers of face 2 of element 1: ") + +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=3, islocal=yes) +CALL Display(con, "Node numbers of face 3 of element 1: ") + +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=4, islocal=yes) +CALL Display(con, "Node numbers of face 4 of element 1: ") + +!---------------------------------------------------------------------------- +! Getting all the connectivity of an element +!---------------------------------------------------------------------------- + +con = cellMesh%GetConnectivity(globalElement=1, islocal=yes, opt='A') +CALL Display(con, "All Connectivity for localElement=1: ") + +!---------------------------------------------------------------------------- +! Initiate ScalarField and FEDOF +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, dom=dom, & + filename=tomlFileName) +CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! Get vertex degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="V") +CALL Display(nrow, "Total Vertex DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="V") +CALL Display(con, "Vertex DOF connectivity for localElement=1:") + +!---------------------------------------------------------------------------- +! Get face degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="F") +CALL Display(nrow, "Total Face DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="F") +CALL Display(con, "Face DOF connectivity for localElement=1:") + +!---------------------------------------------------------------------------- +! Get cell degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="C") +CALL Display(nrow, "Total Cell DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="C") +CALL Display(con, "Cell DOF connectivity for localElement=1:") + +!---------------------------------------------------------------------------- +! Get all degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="A") +CALL Display(nrow, "Total DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="A") +CALL Display(con, "All DOF connectivity for localElement=1:", full=.TRUE.) + +CALL Reallocate(orient, 3, SIZE(con)) +CALL cellMesh%GetFaceOrientation(globalElement=1, islocal=yes, ans=orient, & + nrow=nrow, ncol=ncol) + +CALL Display(orient(1:nrow, 1:ncol), & + "Face orientations for localElement=1: ") + +!---------------------------------------------------------------------------- +! Get all degree of freedom connectivity for local element 3 +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=3, islocal=yes, opt="A") +CALL Display(nrow, "Total DOF for localElement=3:") + +con = fedof%GetConnectivity(globalElement=3, islocal=yes, opt="A") +CALL Display(con, "All DOF connectivity for localElement=3:", full=.TRUE.) + +CALL Reallocate(orient, 3, SIZE(con)) +CALL cellMesh%GetFaceOrientation(globalElement=3, islocal=yes, ans=orient, & + nrow=nrow, ncol=ncol) + +CALL Display(orient(1:nrow, 1:ncol), & + "Face orientations for localElement=3: ") + +END PROGRAM main diff --git a/docs/blog/FEDOF/code/test1.toml b/docs/blog/FEDOF/code/test1.toml new file mode 100644 index 00000000..c792dc85 --- /dev/null +++ b/docs/blog/FEDOF/code/test1.toml @@ -0,0 +1,57 @@ +[domain] +filename = "./mesh/square_3x3.h5" +# meshfile name +group = "/" +# group name in meshfile where data for domain is stored +totalMedium = 1 +# total number of mediums attached to the domain + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 3 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +# [[u.dirichletBC]] +# name = "right_fix" +# idof = 1 +# nodalValueType = "Constant" +# value = 0.0 +# [u.dirichletBC.boundary] +# isSelectionByMeshID = true +# [u.dirichletBC.boundary.meshID] +# line = [1, 2, 3] + +# [[u.neumannBC]] +# name = "left" +# idof = 1 +# nodalValueType = "Space" +# isUserFunction = true +# [u.neumannBC.function] +# name="Function2" +# returnType="Scalar" +# numReturns=1 +# argType="Space" +# numArgs=3 +# luaScript = "./functions.lua" +# luaFunctionName="Function2" +# [u.neumannBC.boundary] +# isSelectionByMeshID = true +# [u.neumannBC.boundary.meshID] +# line = [4] diff --git a/docs/blog/FEDOF/code/test2.F90 b/docs/blog/FEDOF/code/test2.F90 new file mode 100644 index 00000000..c123fdc1 --- /dev/null +++ b/docs/blog/FEDOF/code/test2.F90 @@ -0,0 +1,156 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-02 +! summary: See test1.toml + +PROGRAM main +USE GlobalData, ONLY: DFP, LGT, I4B +USE AbstractMesh_Class +USE FEDomain_Class +USE HDF5File_Class +USE ScalarField_Class +USE FEDOF_Class +USE Display_Method +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! parameters +!---------------------------------------------------------------------------- + +CHARACTER(*), PARAMETER :: tomlFileName = "./test2.toml" +LOGICAL(LGT), PARAMETER :: yes = .TRUE., no = .FALSE. + +!---------------------------------------------------------------------------- +! variables +!---------------------------------------------------------------------------- + +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(FEDOF_) :: fedof +INTEGER(I4B) :: nrow, ncol, tsize + +!---------------------------------------------------------------------------- +! pointer and allocatables +!---------------------------------------------------------------------------- +CLASS(AbstractMesh_), POINTER :: cellMesh => NULL(), boundaryMesh => NULL() +INTEGER(I4B), ALLOCATABLE :: con(:), orient(:, :) + +!---------------------------------------------------------------------------- +! Setting the verbosity +! In Debug mode, there will many messages printed to the screen +! Following code suppress information-exception. +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +!---------------------------------------------------------------------------- +! Domain and Mesh Related +! Initiate FEDomain and get cell mesh pointer +! The cell mesh pointer contains the element of highest spatial dimension. +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +cellMesh => dom%GetMeshPointer() +CALL cellMesh%DisplayMeshInfo(msg="Cell Mesh Info:") + +!---------------------------------------------------------------------------- +! scalarField and fedof: Initiate ScalarField and FEDOF +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, dom=dom, & + filename=tomlFileName) +CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! fedof: Get vertex degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="V") +CALL Display(nrow, "Total Vertex DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="V") +CALL Display(con, "Vertex DOF connectivity for localElement=1:") + +!---------------------------------------------------------------------------- +! fedof: Get face degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="F") +CALL Display(nrow, "Total Face DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="F") +CALL Display(con, "Face DOF connectivity for localElement=1:", full=.TRUE., & + orient="R") + +!---------------------------------------------------------------------------- +! fedof: Get cell degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="C") +CALL Display(nrow, "Total Cell DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="C") +CALL Display(con, "Cell DOF connectivity for localElement=1:", full=.TRUE., & + orient="R") + +!---------------------------------------------------------------------------- +! fedof: Get all degree of freedom connectivity +!---------------------------------------------------------------------------- + +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="A") +CALL Display(nrow, "Total DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="A") +CALL Display(con, "All DOF connectivity for localElement=1:", full=.TRUE., & + orient="R") + +!---------------------------------------------------------------------------- +! fedof: Get the vertex dof +!---------------------------------------------------------------------------- + +CALL Reallocate(con, 100, isExpand=.TRUE., expandFactor=2) +CALL cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="V", & + ans=con, tsize=tsize) +CALL fedof%GetVertexDOF(globalNode=con(1), islocal=.false., ans=con, tsize=tsize) +CALL Display(con(1), "DOF of vertex 1 of element 1:") + +!---------------------------------------------------------------------------- +! fedof: Get the face dof +!---------------------------------------------------------------------------- + +CALL Reallocate(con, 100, isExpand=.TRUE., expandFactor=2) +CALL cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="F", & + ans=con, tsize=tsize) +nrow = con(1) +CALL fedof%GetFaceDOF(globalFace=nrow, islocal=.TRUE., ans=con, & + tsize=tsize) +CALL Display(con(1:tsize), "DOF on face: "//ToString(nrow), full=.TRUE., & + orient="R") + +CALL Reallocate(con, 100, isExpand=.TRUE., expandFactor=2) +CALL cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="F", & + ans=con, tsize=tsize) +nrow = con(3) +CALL fedof%GetFaceDOF(globalFace=nrow, islocal=.TRUE., ans=con, & + tsize=tsize) +CALL Display(con(1:tsize), "DOF on face: "//ToString(nrow), full=.TRUE., & + orient="R") + +!---------------------------------------------------------------------------- +! fedof: Get the cell dof +!---------------------------------------------------------------------------- + +CALL Reallocate(con, 100, isExpand=.TRUE., expandFactor=2) +CALL cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="C", & + ans=con, tsize=tsize) +nrow = con(1) +CALL fedof%GetCellDOF(globalCell=nrow, islocal=.FALSE., ans=con, & + tsize=tsize) +CALL Display(con(1:tsize), "DOF in cell: "//ToString(nrow), full=.TRUE., & + orient="R") + +END PROGRAM main diff --git a/docs/blog/FEDOF/code/test2.toml b/docs/blog/FEDOF/code/test2.toml new file mode 100644 index 00000000..648e0778 --- /dev/null +++ b/docs/blog/FEDOF/code/test2.toml @@ -0,0 +1,57 @@ +[domain] +filename = "./mesh/square_3x3.h5" +# meshfile name +group = "/" +# group name in meshfile where data for domain is stored +totalMedium = 1 +# total number of mediums attached to the domain + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 4 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +# [[u.dirichletBC]] +# name = "right_fix" +# idof = 1 +# nodalValueType = "Constant" +# value = 0.0 +# [u.dirichletBC.boundary] +# isSelectionByMeshID = true +# [u.dirichletBC.boundary.meshID] +# line = [1, 2, 3] + +# [[u.neumannBC]] +# name = "left" +# idof = 1 +# nodalValueType = "Space" +# isUserFunction = true +# [u.neumannBC.function] +# name="Function2" +# returnType="Scalar" +# numReturns=1 +# argType="Space" +# numArgs=3 +# luaScript = "./functions.lua" +# luaFunctionName="Function2" +# [u.neumannBC.boundary] +# isSelectionByMeshID = true +# [u.neumannBC.boundary.meshID] +# line = [4] diff --git a/docs/blog/FEDOF/code/test3.F90 b/docs/blog/FEDOF/code/test3.F90 new file mode 100644 index 00000000..ca822c84 --- /dev/null +++ b/docs/blog/FEDOF/code/test3.F90 @@ -0,0 +1,108 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-02 +! summary: This test follows test1a.F90 +! +! Here we check the compatibility of FEDOF for Hierarchical interpolation +! Mesh is linear and field is cubic. + +PROGRAM main +USE GlobalData, ONLY: DFP, LGT, I4B +USE BaseType, ONLY: QuadraturePoint_, ElemShapeData_ +USE AbstractMesh_Class +USE FEDomain_Class +USE HDF5File_Class +USE ScalarField_Class +USE VectorField_Class +USE FEDOF_Class +USE Display_Method +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE StringUtility +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE AbstractFE_Class +USE FieldUtility, ONLY: VectorFieldSetNodeCoord + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! parameters +!---------------------------------------------------------------------------- + +CHARACTER(*), PARAMETER :: tomlFileName = "./test3.toml" +LOGICAL(LGT), PARAMETER :: yes = .TRUE., no = .FALSE. + +!---------------------------------------------------------------------------- +! variables +!---------------------------------------------------------------------------- + +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(VectorField_) :: nodeCoord +TYPE(FEDOF_) :: fedof, geofedof +TYPE(QuadraturePoint_) :: qp +TYPE(ElemShapeData_) :: elemsd +INTEGER(I4B) :: nrow, ncol +LOGICAL(LGT) :: isShow + +!---------------------------------------------------------------------------- +! pointers and allocatables +!---------------------------------------------------------------------------- + +CLASS(AbstractMesh_), POINTER :: cellMesh => NULL(), boundaryMesh => NULL() +CLASS(AbstractFE_), POINTER :: feptr => NULL() +INTEGER(I4B), ALLOCATABLE :: con(:), orient(:, :) + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +isShow = .FALSE. + +!---------------------------------------------------------------------------- +! Initiate Domain ans mesh +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +IF (isShow) CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +cellMesh => dom%GetMeshPointer() +IF (isShow) CALL cellMesh%DisplayMeshInfo(msg="Cell Mesh Info:") + +!---------------------------------------------------------------------------- +! Initiate ScalarField and FEDOF +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, dom=dom, & + filename=tomlFileName) +IF (isShow) CALL u%Display(msg="ScalarField u: ") +IF (isShow) CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! Initiate nodeCoord +!---------------------------------------------------------------------------- +CALL nodeCoord%ImportFromToml(tomlName="nodeCoord", & + fedof=geofedof, dom=dom, & + filename=tomlFileName) + +CALL nodeCoord%SetName("nodeCoord") +CALL nodeCoord%Set(VALUE=0.0_DFP) +CALL VectorFieldSetNodeCoord(obj=nodeCoord, mesh=cellMesh) + +IF (isShow) CALL nodeCoord%Display(msg="nodeCoord: ") +IF (isShow) CALL geofedof%Display(msg="geofedof: ") + +!---------------------------------------------------------------------------- +! fedof: Getting quadrature points +isShow = .TRUE. +!---------------------------------------------------------------------------- + +CALL fedof%GetQuadraturePoints(quad=qp, globalElement=1, islocal=yes) +IF (isShow) CALL Display(qp, "Quadrature points: ") +CALL fedof%GetLocalElemShapeData(elemsd=elemsd, quad=qp, globalElement=1, & + islocal=yes) +CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "ElemshapeData: ") + + +END PROGRAM main diff --git a/docs/blog/FEDOF/code/test3.toml b/docs/blog/FEDOF/code/test3.toml new file mode 100644 index 00000000..7630b9d9 --- /dev/null +++ b/docs/blog/FEDOF/code/test3.toml @@ -0,0 +1,70 @@ +[domain] +filename = "./mesh/square_3x3.h5" +# meshfile name +group = "/" +# group name in meshfile where data for domain is stored +totalMedium = 1 +# total number of mediums attached to the domain + +[nodeCoord] +name = "nodeCoord" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 3 +fedofName = "space" + +[nodeCoord.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 3 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +# [[u.dirichletBC]] +# name = "right_fix" +# idof = 1 +# nodalValueType = "Constant" +# value = 0.0 +# [u.dirichletBC.boundary] +# isSelectionByMeshID = true +# [u.dirichletBC.boundary.meshID] +# line = [1, 2, 3] + +# [[u.neumannBC]] +# name = "left" +# idof = 1 +# nodalValueType = "Space" +# isUserFunction = true +# [u.neumannBC.function] +# name="Function2" +# returnType="Scalar" +# numReturns=1 +# argType="Space" +# numArgs=3 +# luaScript = "./functions.lua" +# luaFunctionName="Function2" +# [u.neumannBC.boundary] +# isSelectionByMeshID = true +# [u.neumannBC.boundary.meshID] +# line = [4] diff --git a/docs/blog/FEDOF/code/test4.F90 b/docs/blog/FEDOF/code/test4.F90 new file mode 100644 index 00000000..6c0153fe --- /dev/null +++ b/docs/blog/FEDOF/code/test4.F90 @@ -0,0 +1,206 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-02 +! summary: This test follows test1a.F90 +! +! Here we check the compatibility of FEDOF for Hierarchical interpolation +! Mesh is linear and field is cubic. + +PROGRAM main +USE AbstractMesh_Class +USE FEDomain_Class +USE HDF5File_Class +USE ScalarField_Class +USE VectorField_Class +USE FEDOF_Class +USE Display_Method +USE ReallocateUtility +USE StringUtility +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE AbstractFE_Class +USE VTKPlot_Class + +USE GlobalData, ONLY: DFP, LGT, I4B, FMT_NODES +USE BaseType, ONLY: QuadraturePoint_, ElemShapeData_, TypeInterpolationOpt +USE FieldUtility, ONLY: VectorFieldSetNodeCoord +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! parameters +!---------------------------------------------------------------------------- + +CHARACTER(*), PARAMETER :: tomlFileName = "./test4.toml" +LOGICAL(LGT), PARAMETER :: yes = .TRUE., no = .FALSE. +INTEGER(I4B), PARAMETER :: plotDataOrder = 39 + +!---------------------------------------------------------------------------- +! variables +!---------------------------------------------------------------------------- + +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(VectorField_) :: nodeCoord +TYPE(FEDOF_) :: fedof, geofedof +TYPE(QuadraturePoint_) :: qp +TYPE(VTKPlot_) :: plot +TYPE(ElemShapeData_) :: elemsd, geoelemsd +INTEGER(I4B) :: ii, jj, tsize, iel, tElements, tfedof, tgeocon, & + elemCoord_i, elemCoord_j, refelemCoord_i, refelemCoord_j, & + elemIP_j, elemIP_i, tfecon, offset, xij_i, cellOrder(3), & + tCellOrder, faceOrder(3, 8), tfaceOrder_i, tfaceOrder_j +LOGICAL(LGT) :: isShow + +!---------------------------------------------------------------------------- +! pointers and allocatables +!---------------------------------------------------------------------------- + +CLASS(AbstractMesh_), POINTER :: cellMesh => NULL(), boundaryMesh => NULL() +CLASS(AbstractFE_), POINTER :: feptr, geofeptr +REAL(DFP), ALLOCATABLE :: elemCoord(:, :), elemIP(:, :), refelemCoord(:, :), & + xij(:, :), shapeFunc(:, :) +INTEGER(I4B), ALLOCATABLE :: fecon(:), geocon(:) + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +isShow = .FALSE. + +!---------------------------------------------------------------------------- +! Initiate Domain ans mesh +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +IF (isShow) CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +cellMesh => dom%GetMeshPointer() +IF (isShow) CALL cellMesh%DisplayMeshInfo(msg="Cell Mesh Info:") + +!---------------------------------------------------------------------------- +! Initiate ScalarField and FEDOF +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, dom=dom, & + filename=tomlFileName) +IF (isShow) CALL u%Display(msg="ScalarField u: ") +IF (isShow) CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! Initiate nodeCoord +!---------------------------------------------------------------------------- +CALL nodeCoord%ImportFromToml(tomlName="nodeCoord", & + fedof=geofedof, dom=dom, & + filename=tomlFileName) + +CALL nodeCoord%SetName("nodeCoord") +CALL nodeCoord%Set(VALUE=0.0_DFP) +CALL VectorFieldSetNodeCoord(obj=nodeCoord, mesh=cellMesh) + +IF (isShow) CALL nodeCoord%Display(msg="nodeCoord: ") +IF (isShow) CALL geofedof%Display(msg="geofedof: ") + +!---------------------------------------------------------------------------- +! Interpolation points +!---------------------------------------------------------------------------- + +tsize = geofedof%GetMaxTotalConnectivity() +CALL Reallocate(geocon, tsize) +CALL Reallocate(elemCoord, 3, tsize) +CALL Reallocate(refelemCoord, 3, tsize) + +tsize = fedof%GetMaxTotalConnectivity() +CALL Reallocate(fecon, tsize) + +!---------------------------------------------------------------------------- +! Getting total interpolation points +!---------------------------------------------------------------------------- + +tElements = cellMesh%GetTotalElements() +tfedof = fedof%GetTotalDOF() + +xij_i = 0 +DO iel = 1, tElements + feptr => fedof%GetFEPointer(globalElement=iel, islocal=yes) + ii = feptr%GetTotalInterpolationPoints( & + order=[plotDataOrder], ipType=[TypeInterpolationOpt%Equidistance]) + xij_i = xij_i + ii +END DO + +CALL Reallocate(xij, xij_i, 3) +CALL Reallocate(shapeFunc, xij_i, tfedof) + +offset = 0 + +DO iel = 1, tElements + CALL geofedof%GetConnectivity_(ans=geocon, tsize=tgeocon, & + globalElement=iel, islocal=yes, opt="A") + + CALL fedof%GetConnectivity_(globalElement=iel, islocal=yes, & + ans=fecon, tsize=tfecon, opt="A") + + CALL nodeCoord%Get(VALUE=elemCoord, nrow=elemCoord_i, ncol=elemCoord_j, & + globalNode=geocon(1:tgeocon), storageFMT=FMT_NODES, & + islocal=yes) + + IF (isShow) CALL Display(geocon(1:tgeocon), "geocon: ", orient="R") + IF (isShow) CALL Display(elemCoord(1:elemCoord_i, 1:elemCoord_j), & + "elemCoord: ") + + CALL fedof%SetFE(globalElement=iel, islocal=yes) + CALL geofedof%SetFE(globalElement=iel, islocal=yes) + + feptr => fedof%GetFEPointer(globalElement=iel, islocal=yes) + geofeptr => geofedof%GetFEPointer(globalElement=iel, islocal=yes) + + CALL feptr%GetRefElemCoord(ans=refelemCoord, nrow=refelemCoord_i, & + ncol=refelemCoord_j) + + elemIP_j = feptr%GetTotalInterpolationPoints( & + order=[plotDataOrder], & + ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Reallocate(elemIP, 3, elemIP_j, isExpand=.TRUE., expandFactor=2) + + CALL feptr%GetInterpolationPoints( & + xij=refelemCoord, ans=elemIP, nrow=elemIP_i, ncol=elemIP_j, & + order=[plotDataOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(obj=qp, points=elemIP(1:3, 1:elemIP_j)) + + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=qp) + + CALL geofeptr%GetLocalElemShapeData(elemsd=geoelemsd, quad=qp) + + CALL feptr%GetGlobalElemShapeData(elemsd=elemsd, xij=elemCoord, & + geoElemsd=geoelemsd) + + DO ii = 1, elemsd%nns + DO jj = 1, elemsd%nips + shapeFunc(offset + jj, fecon(ii)) = elemsd%N(ii, jj) + xij(offset + jj, 1) = elemsd%coord(1, jj) + xij(offset + jj, 2) = elemsd%coord(2, jj) + END DO + END DO + + offset = offset + elemsd%nips + +END DO + +!---------------------------------------------------------------------------- +! Plotting the data +!---------------------------------------------------------------------------- + +CALL plot%Initiate() + +DO ii = 1, tfedof + CALL plot%Scatter3D( & + x=xij(1:xij_i, 1), y=xij(1:xij_i, 2), z=shapeFunc(1:xij_i, ii), & + label="N", filename="Order4_Elem_"//ToString(ii)//".vtp") +END DO + +CALL plot%DEALLOCATE() + +END PROGRAM main diff --git a/docs/blog/FEDOF/code/test4.toml b/docs/blog/FEDOF/code/test4.toml new file mode 100644 index 00000000..d302fc8b --- /dev/null +++ b/docs/blog/FEDOF/code/test4.toml @@ -0,0 +1,70 @@ +[domain] +filename = "./mesh/square_3x3.h5" +# meshfile name +group = "/" +# group name in meshfile where data for domain is stored +totalMedium = 1 +# total number of mediums attached to the domain + +[nodeCoord] +name = "nodeCoord" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 3 +fedofName = "space" + +[nodeCoord.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +# ipType = "Equidistance" +# baseType = "Monomial" +order = 4 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +# [[u.dirichletBC]] +# name = "right_fix" +# idof = 1 +# nodalValueType = "Constant" +# value = 0.0 +# [u.dirichletBC.boundary] +# isSelectionByMeshID = true +# [u.dirichletBC.boundary.meshID] +# line = [1, 2, 3] + +# [[u.neumannBC]] +# name = "left" +# idof = 1 +# nodalValueType = "Space" +# isUserFunction = true +# [u.neumannBC.function] +# name="Function2" +# returnType="Scalar" +# numReturns=1 +# argType="Space" +# numArgs=3 +# luaScript = "./functions.lua" +# luaFunctionName="Function2" +# [u.neumannBC.boundary] +# isSelectionByMeshID = true +# [u.neumannBC.boundary.meshID] +# line = [4] diff --git a/docs/blog/FEDOF/code/test5.F90 b/docs/blog/FEDOF/code/test5.F90 new file mode 100644 index 00000000..7e759161 --- /dev/null +++ b/docs/blog/FEDOF/code/test5.F90 @@ -0,0 +1,203 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-02 +! summary: This test follows test1a.F90 +! +! Here we check the compatibility of FEDOF for Hierarchical interpolation +! Mesh is linear and field is cubic. + +PROGRAM main +USE AbstractMesh_Class +USE FEDomain_Class +USE HDF5File_Class +USE ScalarField_Class +USE VectorField_Class +USE FEDOF_Class +USE Display_Method +USE ReallocateUtility +USE StringUtility +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE AbstractFE_Class +USE VTKPlot_Class + +USE GlobalData, ONLY: DFP, LGT, I4B, FMT_NODES +USE BaseType, ONLY: QuadraturePoint_, ElemShapeData_, TypeInterpolationOpt +USE FieldUtility, ONLY: VectorFieldSetNodeCoord +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! parameters +!---------------------------------------------------------------------------- + +CHARACTER(*), PARAMETER :: tomlFileName = "./test5.toml" +LOGICAL(LGT), PARAMETER :: yes = .TRUE., no = .FALSE. +INTEGER(I4B), PARAMETER :: plotDataOrder = 19 !! 39 + +!---------------------------------------------------------------------------- +! variables +!---------------------------------------------------------------------------- + +TYPE(FEDomain_) :: dom +TYPE(ScalarField_) :: u +TYPE(VectorField_) :: nodeCoord +TYPE(FEDOF_) :: fedof, geofedof +TYPE(QuadraturePoint_) :: qp +TYPE(VTKPlot_) :: plot +TYPE(ElemShapeData_) :: elemsd, geoelemsd +INTEGER(I4B) :: ii, jj, tsize, iel, tElements, tfedof, tgeocon, & + elemCoord_i, elemCoord_j, refelemCoord_i, refelemCoord_j, & + elemIP_j, elemIP_i, tfecon, offset, xij_i, cellOrder(3), & + tCellOrder, faceOrder(3, 8), tfaceOrder_i, tfaceOrder_j +LOGICAL(LGT) :: isShow + +!---------------------------------------------------------------------------- +! pointers and allocatables +!---------------------------------------------------------------------------- + +CLASS(AbstractMesh_), POINTER :: cellMesh => NULL(), boundaryMesh => NULL() +CLASS(AbstractFE_), POINTER :: feptr, geofeptr +REAL(DFP), ALLOCATABLE :: elemCoord(:, :), elemIP(:, :), refelemCoord(:, :), & + xij(:, :), shapeFunc(:, :) +INTEGER(I4B), ALLOCATABLE :: fecon(:), geocon(:) + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +isShow = .FALSE. + +!---------------------------------------------------------------------------- +! Initiate Domain ans mesh +!---------------------------------------------------------------------------- + +CALL dom%ImportFromToml(tomlName="domain", filename=tomlFileName) +IF (isShow) CALL dom%DisplayDomainInfo(msg="DomainInfo: ") + +cellMesh => dom%GetMeshPointer() +IF (isShow) CALL cellMesh%DisplayMeshInfo(msg="Cell Mesh Info:") + +!---------------------------------------------------------------------------- +! Initiate ScalarField and FEDOF +!---------------------------------------------------------------------------- + +CALL u%ImportFromToml(tomlName="u", fedof=fedof, dom=dom, & + filename=tomlFileName) +IF (isShow) CALL u%Display(msg="ScalarField u: ") +IF (isShow) CALL fedof%Display(msg="FEDOF info: ") + +!---------------------------------------------------------------------------- +! Initiate nodeCoord +!---------------------------------------------------------------------------- +CALL nodeCoord%ImportFromToml(tomlName="nodeCoord", & + fedof=geofedof, dom=dom, & + filename=tomlFileName) + +CALL nodeCoord%SetName("nodeCoord") +CALL nodeCoord%Set(VALUE=0.0_DFP) +CALL VectorFieldSetNodeCoord(obj=nodeCoord, mesh=cellMesh) + +IF (isShow) CALL nodeCoord%Display(msg="nodeCoord: ") +IF (isShow) CALL geofedof%Display(msg="geofedof: ") + +!---------------------------------------------------------------------------- +! Interpolation points +!---------------------------------------------------------------------------- + +tsize = geofedof%GetMaxTotalConnectivity() +CALL Reallocate(geocon, tsize) +CALL Reallocate(elemCoord, 3, tsize) +CALL Reallocate(refelemCoord, 3, tsize) + +tsize = fedof%GetMaxTotalConnectivity() +CALL Reallocate(fecon, tsize) + +!---------------------------------------------------------------------------- +! Getting total interpolation points +!---------------------------------------------------------------------------- + +tElements = cellMesh%GetTotalElements() +tfedof = fedof%GetTotalDOF() + +xij_i = 0 +DO iel = 1, tElements + feptr => fedof%GetFEPointer(globalElement=iel, islocal=yes) + ii = feptr%GetTotalInterpolationPoints( & + order=[plotDataOrder], ipType=[TypeInterpolationOpt%Equidistance]) + xij_i = xij_i + ii +END DO + +CALL Reallocate(xij, xij_i, 3) +CALL Reallocate(shapeFunc, xij_i, tfedof) + +offset = 0 + +DO iel = 1, tElements + CALL geofedof%GetConnectivity_(ans=geocon, tsize=tgeocon, & + globalElement=iel, islocal=yes, opt="A") + + CALL fedof%GetConnectivity_(globalElement=iel, islocal=yes, & + ans=fecon, tsize=tfecon, opt="A") + + CALL nodeCoord%Get(VALUE=elemCoord, nrow=elemCoord_i, ncol=elemCoord_j, & + globalNode=geocon(1:tgeocon), storageFMT=FMT_NODES, & + islocal=yes) + + IF (isShow) CALL Display(geocon(1:tgeocon), "geocon: ", orient="R") + IF (isShow) CALL Display(elemCoord(1:elemCoord_i, 1:elemCoord_j), & + "elemCoord: ") + + CALL fedof%SetFE(globalElement=iel, islocal=yes) + CALL geofedof%SetFE(globalElement=iel, islocal=yes) + + feptr => fedof%GetFEPointer(globalElement=iel, islocal=yes) + geofeptr => geofedof%GetFEPointer(globalElement=iel, islocal=yes) + + CALL feptr%GetRefElemCoord(ans=refelemCoord, nrow=refelemCoord_i, & + ncol=refelemCoord_j) + + elemIP_j = feptr%GetTotalInterpolationPoints( & + order=[plotDataOrder], & + ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Reallocate(elemIP, 3, elemIP_j, isExpand=.TRUE., expandFactor=2) + + CALL feptr%GetInterpolationPoints( & + xij=refelemCoord, ans=elemIP, nrow=elemIP_i, ncol=elemIP_j, & + order=[plotDataOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(obj=qp, points=elemIP(1:3, 1:elemIP_j)) + + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=qp) + + CALL geofeptr%GetLocalElemShapeData(elemsd=geoelemsd, quad=qp) + + CALL feptr%GetGlobalElemShapeData(elemsd=elemsd, xij=elemCoord, & + geoElemsd=geoelemsd) + + DO ii = 1, elemsd%nns + DO jj = 1, elemsd%nips + shapeFunc(offset + jj, fecon(ii)) = elemsd%N(ii, jj) + xij(offset + jj, 1) = elemsd%coord(1, jj) + xij(offset + jj, 2) = elemsd%coord(2, jj) + END DO + END DO + + offset = offset + elemsd%nips + +END DO + +CALL plot%Initiate() + +DO ii = 1, tfedof + CALL plot%Scatter3D(x=xij(1:xij_i, 1), & + y=xij(1:xij_i, 2), & + z=shapeFunc(1:xij_i, ii), label="N", & + filename="Order4_Elem_"//ToString(ii)//".vtp") +END DO + +CALL plot%DEALLOCATE() + +END PROGRAM main diff --git a/docs/blog/FEDOF/code/test5.toml b/docs/blog/FEDOF/code/test5.toml new file mode 100644 index 00000000..113e20b5 --- /dev/null +++ b/docs/blog/FEDOF/code/test5.toml @@ -0,0 +1,70 @@ +[domain] +filename = "./mesh/square_3x3.h5" +# meshfile name +group = "/" +# group name in meshfile where data for domain is stored +totalMedium = 1 +# total number of mediums attached to the domain + +[nodeCoord] +name = "nodeCoord" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 3 +fedofName = "space" + +[nodeCoord.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 4 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + +# [[u.dirichletBC]] +# name = "right_fix" +# idof = 1 +# nodalValueType = "Constant" +# value = 0.0 +# [u.dirichletBC.boundary] +# isSelectionByMeshID = true +# [u.dirichletBC.boundary.meshID] +# line = [1, 2, 3] + +# [[u.neumannBC]] +# name = "left" +# idof = 1 +# nodalValueType = "Space" +# isUserFunction = true +# [u.neumannBC.function] +# name="Function2" +# returnType="Scalar" +# numReturns=1 +# argType="Space" +# numArgs=3 +# luaScript = "./functions.lua" +# luaFunctionName="Function2" +# [u.neumannBC.boundary] +# isSelectionByMeshID = true +# [u.neumannBC.boundary.meshID] +# line = [4] diff --git a/docs/blog/FEDOF/figures/iel1_order4.afdesign b/docs/blog/FEDOF/figures/iel1_order4.afdesign new file mode 100644 index 00000000..9142a8b2 Binary files /dev/null and b/docs/blog/FEDOF/figures/iel1_order4.afdesign differ diff --git a/docs/blog/FEDOF/figures/iel1_order4.svg b/docs/blog/FEDOF/figures/iel1_order4.svg new file mode 100644 index 00000000..c0b5a7dc --- /dev/null +++ b/docs/blog/FEDOF/figures/iel1_order4.svg @@ -0,0 +1,205 @@ + + + + + + + + + + 51 + + + + + 53 + + + + + 54 + + + + + 52 + + + + + 49 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 10 + + + + + 11 + + + + + 5 + + + + + 9 + + + + + 8 + + + + 12 + + + + 46 + + + + + 50 + + + + + 47 + + + + + 13 + + + + + 14 + + + + + 15 + + + + 16 + + + + 17 + + + + + 18 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 48 + + + + diff --git a/docs/blog/FEDOF/figures/order4_mesh3x3.afdesign b/docs/blog/FEDOF/figures/order4_mesh3x3.afdesign new file mode 100644 index 00000000..97403989 Binary files /dev/null and b/docs/blog/FEDOF/figures/order4_mesh3x3.afdesign differ diff --git a/docs/blog/FEDOF/figures/order4_mesh3x3.svg b/docs/blog/FEDOF/figures/order4_mesh3x3.svg new file mode 100644 index 00000000..1a2a48d3 --- /dev/null +++ b/docs/blog/FEDOF/figures/order4_mesh3x3.svg @@ -0,0 +1,731 @@ + + + + + + + + + + + + 78 + + + + + 80 + + + + + 81 + + + + + 79 + + + + + 76 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + + + + 73 + + + + + 77 + + + + + 74 + + + + + 42 + + + + + 41 + + + + + 40 + + + + + 45 + + + + + 44 + + + + + 43 + + + + + 75 + + + + + + + + + + 69 + + + + + 71 + + + + + 72 + + + + + 70 + + + + + 67 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 33 + + + + + 32 + + + + + 2 + + + + + 6 + + + + + 31 + + + + + 64 + + + + + 68 + + + + + 65 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 39 + + + + + 38 + + + + + 37 + + + + + 66 + + + + + + + + + + 60 + + + + + 62 + + + + + 63 + + + + + 61 + + + + + 58 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + + + + + 4 + + + + + 55 + + + + + 59 + + + + + 56 + + + + + 24 + + + + + 23 + + + + + 22 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + 30 + + + + + 29 + + + + + 28 + + + + + 57 + + + + + + + + + + 51 + + + + + 53 + + + + + 54 + + + + + 52 + + + + + 49 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + 10 + + + + + 11 + + + + + 5 + + + + + 9 + + + + + 8 + + + + + 12 + + + + + 46 + + + + + 50 + + + + + 47 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 48 + + + + diff --git a/docs/blog/FEDOF/figures/square_3x3.svg b/docs/blog/FEDOF/figures/square_3x3.svg new file mode 100644 index 00000000..79f56f17 --- /dev/null +++ b/docs/blog/FEDOF/figures/square_3x3.svg @@ -0,0 +1,46 @@ + + +square_3x3 + +Creator: GL2PS 1.4.3, (C) 1999-2020 C. Geuzaine +For: Gmsh +CreationDate: Thu Oct 2 14:22:38 2025 + + + + + + + + + + + + + + + + +13 +14 +15 +16 + + + + + + +1 +2 +3 +4 +5 +6 +7 +8 +9 + + diff --git a/docs/blog/FEDOF/understanding-fedof-1.md b/docs/blog/FEDOF/understanding-fedof-1.md new file mode 100644 index 00000000..4c366821 --- /dev/null +++ b/docs/blog/FEDOF/understanding-fedof-1.md @@ -0,0 +1,256 @@ +--- +title: Understanding FEDOF in easifem (Part 1) +description: This post explains concept of FEDOF in easifem. +authors: + - vickysharma0812 +tags: [mesh, fedof, basis, shapeFunctions] +hide_table_of_contents: false +--- + +## FEDOF + +`FEDOF` denotes the finite element degree of freedom. The concept of degree of freedom depends upon the type of finite element approximation (basis functions) used for the problem. + +:::note +These series of notes will present the FEDOF concept for for H1 conforming Hierarchical and Lagrange basis functions. +::: + +- For Lagrange polynomials the degree of freedoms are associatd with the nodes of the mesh. In this case, a node implies a point in the mesh. This point can be a vertex, somewhere on the edge, face, or interior of the element. +- For Hierarchical polynmials the degree of freedoms are associated with the modes. They can be associated with nodes, edges, faces and interior of the elements. In this case the node has an abstract meaning. But we will associcate them with the vertex, edge, face, and interior basis functions. +- In the case of H1 conforming basis functions with Hierarchical polynomials, the orientation of edge and faces with respect to the master element is very important. However, for Lagrange polynomials the orientation is not so much needed if we generate the nodes correctly for higher order mesh. + + + +## Mesh related stuff + +In this note we will focus on 2D mesh with quadrilateral. + +![Quadrilateral mesh](./figures/square_3x3.svg) + +Information about this domain is given below: + +```txt +engine: GMSH 4.1 0 8 +version: 4.1 +nsd: 2 +minNptrs: 1 +maxNptrs: 9 +minElemNum: 1 +maxElemNum: 16 +tNodes: 9 +tEntitiesForNodes: 9 +tEntitiesForElements: 9 +tElements: 4, 8, 4, 0 +total mesh of volume: 0 +total mesh of surface: 1 +total mesh of curve: 4 +total mesh of point: 4 +``` + +The information about the cell mesh is given below. + +```txt +total nodes: 9 +total elements: 4 +tEdges: 0 +tFaces: 12 +``` + +:::info +For a 2D-mesh, we do not define the edges. For 2D mesh we only have Cell, faces, and vertices. +::: + +From the domain we can get the pointer to mesh of cells. In this case a cell is made of quadrilateral elements. + +```fortran +cellMesh => dom%GetMeshPointer() +``` + +We can get the maximum number of nodes in an element by using `GetMaxNNE()` method. + +```fortran +maxNNE = cellMesh%GetMaxNNE() +``` + +For this mesh the value of `maxNNE` will be 4, as the maximum number of nodes in a quadrilateral element is 4. + +:::info +You can think maxNNE as the maximum number of vertex connectivity for elements of mesh. +::: + +We can get the global element number of a local element number by using following. + +```fortran +iel = cellMesh%GetGlobalElemNumber(localElement=1) +``` + +:::note "GlobalElement vs LocalElement Number" +Global element number is what you see in the mesh file, it the element number assigned by the mesh generator. Whereas, local element number is the location of this element inside the cellMesh object. We do not hope you to know the local element number, therefore, you can convert global element number to local element by using the method `GetLocalElemNumber()`. +::: + +In this case iel will be 13. + +## Vertex connectivity of mesh + +The vertex connectivity of this element can be obtained by using the following code. + +```fortran +con = cellMesh%GetConnectivity(globalElement=1, islocal=yes, opt="V") +``` + +:::note +To get vertex connectivity we use opt="V", for face connectivity we will use opt="F", for edge connectivity we will use opt="E", and for cell connectivity we will use opt="C", and for all connectivity we will use opt="A". +::: + +The vertex connectivity of global element 13 (local element 1) is given below. + +```txt +1 5 9 8 +``` + +:::caution +Note that the vertex connectivity is returned in terms of global vertex numbers. +::: + +## Face connectivity of mesh + +Now lets get the face connectivity for this element. + +We can enquire about the total number of faces in the mesh by using the method `GetTotalFaces()` as shown below. + +```fortran +CALL Display(cellMesh%GetTotalFaces(), "Total faces in mesh:") +``` + +The face connectivity of global Element 13 (local element 1) can be obtained by using the following. + +```fortran +con = cellMesh%GetConnectivity(globalElement=1, islocal=yes, opt="F") +CALL Display(con, "Connectivity of faces for globalElement=1: ") +``` + +The result is given below. + +```txt +1 2 3 4 +``` + +:::note +These are local face numbers. Note that there are no global face numbers because the mesh file does not provide face number. Therefore, the concept of global or local face number is not valid here. +::: + +We can get the orientation of these faces by using `GetFaceOrientation()`, the face orientation is a two dimensional array, where first dimension contains the face orientation flag in two dimensions and the second dimension contains the local face number. The following code is related to getting the face orientation. + +:::caution +The number of rows in faceOrientation should be 3. +::: + +```fortran +CALL Reallocate(orient, 3, SIZE(con)) +CALL cellMesh%GetFaceOrientation(globalElement=1, islocal=yes, ans=orient, & + nrow=nrow, ncol=ncol) +CALL Display(orient(1:nrow, 1:ncol), & + "Face orientations for globalElement=1: ") +``` + +The result is given below. + +```txt +Face orientations for globalElement=1: +--------------------------------------- + 1 1 -1 -1 +``` + +Let's understand the concept of face orientation. + +The vertex connectivity of global element 13 is given by `[1 5 9 8]`. The faces are oriented in the counter clockwise direction. + +- Local face 1 is form vertex 1 to vertex 5 +- Local face 2 is form vertex 5 to vertex 9 +- Local face 3 is form vertex 9 to vertex 8 +- Local face 4 is form vertex 8 to vertex 1 + +In 2D, positive orientation of a face means from small to large vertex number. Therefore, + +- Local face 1, form vertex 1 to vertex 5, has positive orientation. +- Local face 2, form vertex 5 to vertex 9, has positive orientation. +- Local face 3, form vertex 9 to vertex 8, has negative orientation. +- Local face 4, form vertex 8 to vertex 1, has negative orientation. + +:::warning +If you try to get the edge data for 2D mesh you will get nothing because edge data is note defined for 2D mesh. +::: + +Getting vertex connectivity of the a face. To get the node numbers of a face we need to describe the globalElement and the local face number as shown below. + +```fortran +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=1, islocal=yes) +CALL Display(con, "Node numbers of face 1 of element 1: ") + +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=2, islocal=yes) +CALL Display(con, "Node numbers of face 2 of element 1: ") + +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=3, islocal=yes) +CALL Display(con, "Node numbers of face 3 of element 1: ") + +con = cellMesh%GetFacetConnectivity(globalElement=1, iface=4, islocal=yes) +CALL Display(con, "Node numbers of face 4 of element 1: ") +``` + +The result is given below. + +```txt +Node numbers of face 1 of element 1: [1 5] +Node numbers of face 2 of element 1: [5 9] +Node numbers of face 3 of element 1: [9 8] +Node numbers of face 4 of element 1: [8 1] +``` + +:::caution +Note these face connectivities are for local face of element. +::: + +## Getting all connectivity of mesh + +we can get all connectivity of an element by using the following code. + +```fortran +con = cellMesh%GetConnectivity(globalElement=1, islocal=yes, opt='V') +CALL Display(con, "Connectivity of vertex for localElement=1: ") +``` + +## Scalar FEDOF + +Getting the degree of freedom for scalar field. + +- Vertex DOF connectivity for localElement=1: + +```txt +1 5 9 8 +``` + +- Face DOF connectivity for localElement=1: + +```txt +10 11 12 13 +``` + +- Cell DOF connectivity for localElement=1: + +```txt +22 +``` + +- All DOF connectivity for localElement=1: + +```txt +1 5 9 8 10 11 12 13 22 +``` + +There is another way to get FEDOF connectivity. + +From the cellMesh we get the connectivity with opt "V", "F", "C", and "A" for vertex, face, cell, and all DOF connectivity respectively. Then for each of these abstract node number we can call following methods on FEDOF object. + +- `GetVertextDOF()` +- `GetFaceDOF()` +- `GetCellDOF()` diff --git a/docs/blog/FEDOF/understanding-fedof-2.md b/docs/blog/FEDOF/understanding-fedof-2.md new file mode 100644 index 00000000..5d753193 --- /dev/null +++ b/docs/blog/FEDOF/understanding-fedof-2.md @@ -0,0 +1,173 @@ +--- +title: Understanding FEDOF in easifem (Part 2) +description: This post explains concept of FEDOF in easifem. +authors: + - vickysharma0812 +tags: [mesh, fedof] +hide_table_of_contents: false +--- + +## FEDOF + +:::note +Read the part 1 of this series [here](./understanding-fedof-1.md) before proceeding further. +::: + +In this note we will study the FEDOF for scalar field using H1 conforming Hierarchical basis functions. +The main focus on the degree of freedom associated with vertex, face, and cell of the element. + +## Mesh related stuff + +In this note we will focus on 2D mesh with quadrilateral. + +![Quadrilateral mesh](./figures/square_3x3.svg) + + + +## Scalar FEDOF + +Initiate the FEDOF object and scalar field by using the following code. + +```fortran +CALL u%ImportFromToml(tomlName="u", fedof=fedof, dom=dom, filename=tomlFileName) +CALL fedof%Display(msg="FEDOF info: ") +``` + +## Getting all the connectivity + +![Scalar FEDOF in global element 13](./figures/iel1_order4.svg) + +The following code gets all the DOF in an element. + +```txt +1 5 9 8 10 11 12 13 14 15 16 17 18 19 20 21 46 47 48 49 50 51 52 53 54 +``` + +## Vertex connectivity + +Following code gets the vertex DOF connectivity. + +```fortran +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="V") +CALL Display(nrow, "Total Vertex DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="V") +CALL Display(con, "Vertex DOF connectivity for localElement=1:") +``` + +```txt +1 5 9 8 +``` + +:::note +These are local DOF numbers, and it has nothing to do with the mesh connectivity. +::: + +We can get the DOF of a single vertex by using `GetVertexDOF()` as shown below. + +```fortran +CALL Reallocate(con, 100) +call cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="V", ans=con, tsize=tsize) +CALL fedof%GetVertexDOF(globalNode=con(1), islocal=.false., ans=con, tsize=tsize) +CALL Display(con(1), "DOF of vertex 1 of element 1:") +``` + +## Face connectivity + +Following code gets the connectivity of all face DOF in an element. Note that these face DOF are local. In addition, they are related to the positive oriented faces only. + +```fortran +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="F") +CALL Display(nrow, "Total Face DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="F") +CALL Display(con, "Face DOF connectivity for localElement=1:", full=.TRUE., & + orient="R") +``` + +```txt +10 11 12 13 14 15 16 17 18 19 20 21 +``` + +We can get the DOF of a face by using `GetFaceDOF()` as shown below. + +```fortran +CALL Reallocate(con, 100, isExpand=.TRUE., expandFactor=2) +CALL cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="F", & + ans=con, tsize=tsize) +nrow = con(1) +CALL fedof%GetFaceDOF(globalFace=nrow, islocal=.TRUE., ans=con, & + tsize=tsize) +CALL Display(con(1:tsize), "DOF on face: "//ToString(nrow), full=.TRUE., & + orient="R") +``` + +:::info DOF on face: 1 + +```txt +10 11 12 +``` + +::: + +Getting dof on local face 3 on element 1: + +```fortran +CALL Reallocate(con, 100, isExpand=.TRUE., expandFactor=2) +CALL cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="F", & + ans=con, tsize=tsize) +nrow = con(3) +CALL fedof%GetFaceDOF(globalFace=nrow, islocal=.TRUE., ans=con, & + tsize=tsize) +CALL Display(con(1:tsize), "DOF on face: "//ToString(nrow), full=.TRUE., & + orient="R") +``` + +:::info DOF of face: 3 + +```txt +16 17 18 +``` + +::: + +## Cell connectivity + +Following code gets the connectivity of cell in an element. Note that these DOFs are local. + +```fortran +nrow = fedof%GetTotalDOF(globalElement=1, islocal=yes, opt="C") +CALL Display(nrow, "Total Cell DOF for localElement=1:") + +con = fedof%GetConnectivity(globalElement=1, islocal=yes, opt="C") +CALL Display(con, "Cell DOF connectivity for localElement=1:") +``` + +:::info Result + +```txt +46 47 48 49 50 51 52 53 54 +``` + +::: + +We can get the cell DOF by using `GetCellDOF()` as shown below. + +```fortran +CALL Reallocate(con, 100, isExpand=.TRUE., expandFactor=2) +CALL cellMesh%GetConnectivity_(globalElement=1, islocal=yes, opt="C", & + ans=con, tsize=tsize) +nrow = con(1) +CALL fedof%GetCellDOF(globalCell=nrow, islocal=.FALSE., ans=con, & + tsize=tsize) +CALL Display(con(1:tsize), "DOF in cell: "//ToString(nrow), full=.TRUE., & + orient="R") +``` + +:::info DOF in cell: 13 + +```txt +46 47 48 49 50 51 52 53 54 +``` + +::: diff --git a/docs/blog/FEDOF/understanding-fedof-3.md b/docs/blog/FEDOF/understanding-fedof-3.md new file mode 100644 index 00000000..dc067ced --- /dev/null +++ b/docs/blog/FEDOF/understanding-fedof-3.md @@ -0,0 +1,56 @@ +--- +title: Understanding FEDOF in easifem (Part 3) +description: This post explains concept of FEDOF in easifem. +authors: + - vickysharma0812 +tags: [mesh, fedof] +hide_table_of_contents: false +--- + +## FEDOF + +:::note + +- Read the part 1 of this series [here](./understanding-fedof-1.md) before proceeding further. +- Read the part 2 of this series [here](./understanding-fedof-2.md) before proceeding further. + +::: + +In this note we will study the FEDOF for scalar field using H1 conforming Hierarchical basis functions. +The main focus is on generating quadrature points and shape functions. + +In this note we will focus on 2D mesh with quadrilateral. + +![Quadrilateral mesh](./figures/square_3x3.svg) + + + +## Scalar FEDOF + +Initiate the FEDOF object and scalar field by using the following code. + +```fortran +CALL u%ImportFromToml(tomlName="u", fedof=fedof, dom=dom, filename=tomlFileName) +CALL fedof%Display(msg="FEDOF info: ") +``` + +## Getting quadrature points + +The following code gets the quadrature points in an element. + +```fortran +CALL fedof%GetQuadraturePoints(quad=qp, globalElement=1, islocal=yes) +CALL Display(qp, "Quadrature points: ") +``` + +:::note Quadrature points + +| x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | +| :-------: | :-------: | :-------: | :-------: | :-------: | :-------: | :-------: | :-------: | :-------: | :-------: | :------: | :------: | :-------: | :-------: | :------: | :------: | +| -0.861136 | -0.861136 | -0.861136 | -0.861136 | -0.339981 | -0.339981 | -0.339981 | -0.339981 | 0.339981 | 0.339981 | 0.339981 | 0.339981 | 0.861136 | 0.861136 | 0.861136 | 0.861136 | +| -0.861136 | -0.339981 | 0.339981 | 0.861136 | -0.861136 | -0.339981 | 0.339981 | 0.861136 | -0.861136 | -0.339981 | 0.339981 | 0.861136 | -0.861136 | -0.339981 | 0.339981 | 0.861136 | +| 0.121003 | 0.226852 | 0.226852 | 0.121003 | 0.226852 | 0.425293 | 0.425293 | 0.226852 | 0.226852 | 0.425293 | 0.425293 | 0.226852 | 0.121003 | 0.226852 | 0.226852 | 0.121003 | + +::: + +## Getting shape functions diff --git a/docs/docs-api/AbstractBC/AbstractBC_.md b/docs/docs-api/AbstractBC/AbstractBC_.md index 5fe9977a..8c6758e9 100644 --- a/docs/docs-api/AbstractBC/AbstractBC_.md +++ b/docs/docs-api/AbstractBC/AbstractBC_.md @@ -12,32 +12,201 @@ sidebar_position: 2 ```fortran TYPE, ABSTRACT :: AbstractBC_ - LOGICAL(LGT) :: isInitiated = .FALSE. + PRIVATE + + LOGICAL(LGT) :: isInit = .FALSE. !! It is true if the object is initiated - TYPE(String) :: name - !! name of boundary condition - INTEGER(I4B) :: idof = default_idof - !! degree of freedom number - INTEGER(I4B) :: nodalValueType = default_nodalValueType - !! Constant, Space, SpaceTime, Time LOGICAL(LGT) :: isNormal = default_isNormal !! True if the boundary condition is normal to the boundary LOGICAL(LGT) :: isTangent = default_isTangent !! True if the boundary condition is tangent to the boundary - LOGICAL(LGT) :: useExternal = default_useExternal + LOGICAL(LGT) :: isUseExternal = default_useExternal !! if true then nodal values are used externally !! depending upon the context. !! Basically we do not use the nodal value stored in the !! instance of AbstractBC_ LOGICAL(LGT) :: isUserFunction = default_isUserFunction !! True if userFunction is set + LOGICAL(LGT) :: isElemToFace = .FALSE. + !! When elemToFace is set then isElemToFace is true + LOGICAL(LGT) :: isElemToEdge = .FALSE. + !! When elemToEdge is set then isElemToEdge is true + + TYPE(String) :: name + !! name of boundary condition + + INTEGER(I4B) :: idof = default_idof + !! degree of freedom number + INTEGER(I4B) :: nodalValueType = default_nodalValueType + !! Constant, Space, SpaceTime, Time + INTEGER(I4B) :: nrow = 0 + !! number of rows in nodalValue + !! constantNodalValue nrow = 1 + !! spaceNodalValue nrow = size of nodenum + !! timeNodalValue nrow = size of timenodalvalue + !! spaceTimeNodalValue nrow = size of nodenum + INTEGER(I4B) :: ncol = 0 + !! number of columns in nodalvalue + !! constantNodalValue ncol = 1 + !! spaceNodalValue ncol = 1 + !! timeNodalValue ncol = 1 + !! spaceTimeNodalValue ncol = size of times + INTEGER(I4B) :: tElemToFace = 0 + !! number of col in elemToFace + INTEGER(I4B) :: tElemToEdge = 0 + !! number of col in elemToEdge + + INTEGER(I4B), ALLOCATABLE :: nodenum(:) + !! node numbers, where dirichlet boundary condition will be imposed + !! info: to be used soon + + INTEGER(I4B), ALLOCATABLE :: elemToFace(:, :) + !! each col contains the following data: + !! localCellNum, localFaceNum + !! two col are ordered with respect to localCellNum + !! For example, if a cell has two or more faces where boundary condition + !! is applied, then this data will be stored in two consequtive rows: + !! col1: localCellNum1, localFace1 + !! col2: localCellNum1, localFace2 + !! + !! if the value of localFace is zero, then it means + !! boundary condition is not applied on that face + + INTEGER(I4B), ALLOCATABLE :: elemToEdge(:, :) + !! It is used for 3D mesh + !! each cols contains the following data: + !! localCellNum, localEdgeNum + !! two cols are ordered with respect to localCellNum + !! For example, if a cell has two or more faces where boundary condition + !! is applied, then this data will be stored in two consequtive rows: + !! col1: localCellNum1, localEdge1 + !! col2: localCellNum1, localEdge2 + !! + !! if the value of localEdge is zero, then it means + !! boundary condition is not applied on that edge + REAL(DFP), ALLOCATABLE :: nodalValue(:, :) !! nodal values are kept here, !! nodalValues( :, its ) denotes nodal values at time step its + !! nodalValue is used when useFunction and useExternal is false + CLASS(UserFunction_), POINTER :: func => NULL() !! User function TYPE(MeshSelection_) :: boundary !! Boundary - CLASS(Domain_), POINTER :: dom => NULL() + CLASS(AbstractDomain_), POINTER :: dom => NULL() !! Domain +END TYPE AbstractBC_ ``` + +## Logical Flags + +- **isInit**: + - Default: `.FALSE.` + - Description: It is true if the object is initiated + +- **isNormal**: + - Default: `default_isNormal` + - Description: True if the boundary condition is normal to the boundary + +- **isTangent**: + - Default: `default_isTangent` + - Description: True if the boundary condition is tangent to the boundary + +- **isUseExternal**: + - Default: `default_useExternal` + - Description: If true then nodal values are used externally depending upon the context. Basically we do not use the nodal value stored in the instance of AbstractBC_ + +- **isUserFunction**: + - Default: `default_isUserFunction` + - Description: True if userFunction is set + +- **isElemToFace**: + - Default: `.FALSE.` + - Description: When elemToFace is set then isElemToFace is true + +- **isElemToEdge**: + - Default: `.FALSE.` + - Description: When elemToEdge is set then isElemToEdge is true + +## Basic Properties + +- **name**: + - Type: `String` + - Description: Name of boundary condition + +- **idof**: + - Type: `INTEGER(I4B)` + - Default: `default_idof` + - Description: Degree of freedom number + +- **nodalValueType**: + - Type: `INTEGER(I4B)` + - Default: `default_nodalValueType` + - Description: Specifies type - Constant, Space, SpaceTime, or Time + +- **nrow**: + - Type: `INTEGER(I4B)` + - Default: `0` + - Description: Number of rows in nodalValue + - constantNodalValue: nrow = 1 + - spaceNodalValue: nrow = size of nodenum + - timeNodalValue: nrow = size of timenodalvalue + - spaceTimeNodalValue: nrow = size of nodenum + +- **ncol**: + - Type: `INTEGER(I4B)` + - Default: `0` + - Description: Number of columns in nodalvalue + - constantNodalValue: ncol = 1 + - spaceNodalValue: ncol = 1 + - timeNodalValue: ncol = 1 + - spaceTimeNodalValue: ncol = size of times + +- **tElemToFace**: + - Type: `INTEGER(I4B)` + - Default: `0` + - Description: Number of columns in elemToFace + +- **tElemToEdge**: + - Type: `INTEGER(I4B)` + - Default: `0` + - Description: Number of columns in elemToEdge + +## Allocatable Arrays + +- **nodenum**: + - Type: `INTEGER(I4B), ALLOCATABLE` + - Dimension: `(:)` + - Description: Node numbers where Dirichlet boundary condition will be imposed + +- **elemToFace**: + - Type: `INTEGER(I4B), ALLOCATABLE` + - Dimension: `(:, :)` + - Description: Each column contains localCellNum and localFaceNum. Columns are ordered with respect to localCellNum. If a cell has multiple faces where boundary condition is applied, they are stored in consecutive columns. If localFace is zero, boundary condition is not applied on that face. + +- **elemToEdge**: + - Type: `INTEGER(I4B), ALLOCATABLE` + - Dimension: `(:, :)` + - Description: Used for 3D mesh. Each column contains localCellNum and localEdgeNum. Columns are ordered with respect to localCellNum. If a cell has multiple edges where boundary condition is applied, they are stored in consecutive columns. If localEdge is zero, boundary condition is not applied on that edge. + +- **nodalValue**: + - Type: `REAL(DFP), ALLOCATABLE` + - Dimension: `(:, :)` + - Description: Stores nodal values. nodalValues(:, its) denotes nodal values at time step its. Used when useFunction and useExternal are false. + +## References/Pointers + +- **func**: + - Type: `CLASS(UserFunction_), POINTER` + - Default: `NULL()` + - Description: User function + +- **boundary**: + - Type: `TYPE(MeshSelection_)` + - Description: Boundary + +- **dom**: + - Type: `CLASS(AbstractDomain_), POINTER` + - Default: `NULL()` + - Description: Domain diff --git a/docs/docs-api/AbstractBC/GetTotalNodeNum.md b/docs/docs-api/AbstractBC/GetTotalNodeNum.md new file mode 100644 index 00000000..a70df5fd --- /dev/null +++ b/docs/docs-api/AbstractBC/GetTotalNodeNum.md @@ -0,0 +1,18 @@ +# GetTotalNodeNum + +Get the total node numbers stored in the boundary condition. + +## Interface + +```fortran +INTERFACE + MODULE FUNCTION GetTotalNodeNum(obj, fedof) RESULT(ans) + CLASS(AbstractBC_), INTENT(INOUT) :: obj + !! Abstract boundary condition + CLASS(FEDOF_), INTENT(IN) :: fedof + !! FEDOF + INTEGER(I4B) :: ans + !! ans + END FUNCTION GetTotalNodeNum +END INTERFACE +``` diff --git a/docs/docs-api/AbstractBC/SetElemToLocalBoundary.md b/docs/docs-api/AbstractBC/SetElemToLocalBoundary.md new file mode 100644 index 00000000..fed3e711 --- /dev/null +++ b/docs/docs-api/AbstractBC/SetElemToLocalBoundary.md @@ -0,0 +1,52 @@ +# SetElemToLocalBoundary + +This method sets the element to face and element to edge data. + +In particular it set the following data in an instance of `AbstractBC_`: + +- `elemToFace` +- `elemToEdge` +- `tElemToFace` +- `tElemToEdge` + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE SetElemToLocalBoundary(obj) + CLASS(AbstractBC_), INTENT(INOUT) :: obj + END SUBROUTINE SetElemToLocalBoundary +END INTERFACE +``` + +## Purpose + +This procedure sets up the mapping data between boundary elements and their corresponding local cell elements in the domain. It identifies which cells are connected to boundary faces or edges, and stores this information in the `elemToFace` and `elemToEdge` arrays. + +## Description +The method establishes two key mappings required for applying boundary conditions: + +1. **Element to Face Mapping**: For each boundary face element, identifies the corresponding cell element and local face number within that cell. + +2. **Element to Edge Mapping**: For 3D problems, identifies the mapping between boundary edge elements and the corresponding cell elements and local edge numbers. + +These mappings are essential for enforcing boundary conditions in finite element analysis, especially for hierarchical elements where conditions need to be applied to specific faces or edges of elements. + +## Implementation Details +The procedure: +1. Calls `set_elem_to_faces` to establish the element-to-face connectivity +2. Calls `set_elem_to_edges` to establish the element-to-edge connectivity (for 3D problems) + +The implementation populates: +- `obj%elemToFace`: A 2×N array where each column contains [localCellNumber, localFaceNumber] +- `obj%elemToEdge`: A 2×N array where each column contains [localCellNumber, localEdgeNumber] + +The results are stored in the `AbstractBC_` object and can be accessed when applying boundary conditions. + +## Notes +- This method is particularly important for hierarchical finite elements where boundary conditions must be applied to specific faces or edges. +- For face elements, the method works in domains of dimension 2 or higher. +- For edge elements, the method only works in 3D domains. +- Once called, the object's `isElemToFace` and/or `isElemToEdge` flags are set to `.TRUE.`. + + diff --git a/docs/docs-api/AbstractBC/index.md b/docs/docs-api/AbstractBC/index.md index 7fc02687..357b218c 100644 --- a/docs/docs-api/AbstractBC/index.md +++ b/docs/docs-api/AbstractBC/index.md @@ -32,11 +32,8 @@ There are three methods for constructing an instance of `AbstractBC`. ### Construction by paramters 1. The first step is to set the necessary Parameters by calling the method called [SetAbstractBCParam](/docs-api/AbstractBC/SetAbstractBCParam). - 2. In the second step, we define a boundary. To this end, we will use the [MeshSelection](/docs-api/MeshSelection). - 3. In the third step, we call [Initiate](/docs-api/AbstractBC/Initiate) method. To initiate an instance of `AbstractBC`, we need to pass the boundary, paramters, and domain. - 4. In the fourth step, we call [Set](/docs-api/AbstractBC/Set) method to set the value of boundary condition. ### Construction by `HDF5File` diff --git a/docs/docs-api/AbstractOneDimFE/AbstractOneDimFE_.md b/docs/docs-api/AbstractOneDimFE/AbstractOneDimFE_.md new file mode 100644 index 00000000..6f65f0a3 --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/AbstractOneDimFE_.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +--- + +# Structure + +`AbstractOneDimFE_` is an abstract class that serves as the foundation for all one-dimensional finite element implementations in the EASIFEM library. It defines common attributes and methods that all specific one-dimensional elements must implement or inherit. + +A finite element is defined by + +- Reference element +- Polynomials space +- Degree of freedoms + +```fortran +TYPE, ABSTRACT :: AbstractOneDimFE_ + PRIVATE + LOGICAL(LGT) :: isInitiated = .FALSE. + !! It is set to true at the time of constructor + + TYPE(OneDimBasisOpt_) :: opt + + REAL(DFP), ALLOCATABLE :: coeff(:, :) + !! coefficient necessary for lagrange interpolation + + REAL(DFP), ALLOCATABLE :: xij(:, :) + !! interpolation points for lagrange polynomial + !! coeff, and xij are needed internally for + !! constructing the lagrange polynomial +end type AbstractOneDimFE_ +``` + +- `isInitiated` - Initialization status flag +- `opt` - Options for one-dimensional basis functions +- `coeff` - Coefficients necessary for Lagrange interpolation +- `xij` - Interpolation points for Lagrange polynomial + diff --git a/docs/docs-api/AbstractOneDimFE/CheckEssentialParam.md b/docs/docs-api/AbstractOneDimFE/CheckEssentialParam.md new file mode 100644 index 00000000..fbe3e176 --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/CheckEssentialParam.md @@ -0,0 +1,37 @@ +# AbstractOneDimFECheckEssentialParam + +Checks if all required parameters are present in the parameter list before element initialization. + +```fortran +SUBROUTINE AbstractOneDimFECheckEssentialParam(obj, param) +``` + +- `obj` - The AbstractOneDimFE_ object +- `param` - The parameter list to check + +## Interface + +```fortran +MODULE SUBROUTINE obj_CheckEssentialParam(obj, param) + CLASS(AbstractOneDimFE_), INTENT(IN) :: obj + TYPE(ParameterList_), INTENT(IN) :: param +END SUBROUTINE obj_CheckEssentialParam +``` + +- `obj`: The AbstractOneDimFE_ instance (input) +- `param`: Parameter list to check (input) + +## Description + +This routine checks if all the required parameters are present in the parameter list for initializing the AbstractOneDimFE_ object. The essential parameters include: + +- order +- fetype +- ipType +- refElemDomain +- baseContinuity +- baseInterpolation +- basisType +- alpha +- beta +- lambda diff --git a/docs/docs-api/AbstractOneDimFE/Copy.md b/docs/docs-api/AbstractOneDimFE/Copy.md new file mode 100644 index 00000000..ca7df649 --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/Copy.md @@ -0,0 +1,19 @@ +# Copy + +Initiates an instance of the finite element by copying from another instance. + +:::note +This method can be called directly or through the assignment operator (=). +::: + +## Interface + +```fortran +MODULE SUBROUTINE obj_Copy(obj, obj2) + CLASS(AbstractOneDimFE_), INTENT(INOUT) :: obj + CLASS(AbstractOneDimFE_), INTENT(IN) :: obj2 +END SUBROUTINE obj_Copy +``` + +- `obj`: Target AbstractOneDimFE_ instance to copy to (inout) +- `obj2`: Source AbstractOneDimFE_ instance to copy from (input) diff --git a/docs/docs-api/AbstractOneDimFE/Deallocate.md b/docs/docs-api/AbstractOneDimFE/Deallocate.md new file mode 100644 index 00000000..128908ee --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/Deallocate.md @@ -0,0 +1,41 @@ +# Deallocate + +Deallocates memory associated with an `AbstractOneDimFE_` object. + +```fortran +SUBROUTINE AbstractOneDimFEDeallocate(obj) +``` + +- `obj` - The AbstractOneDimFE_ object to deallocate + +Alternative form: + +```fortran +SUBROUTINE AbstractOneDimFEDeallocate(obj) +``` + +Deallocates an array of `AbstractOneDimFEPointer_` objects. + +- `obj` - Array of AbstractOneDimFEPointer_ to deallocate + +## Interface 1 + +```fortran +! Method 1: Deallocate a single instance +MODULE SUBROUTINE obj_Deallocate(obj) + CLASS(AbstractOneDimFE_), INTENT(INOUT) :: obj +END SUBROUTINE obj_Deallocate +``` + +- `obj`: AbstractOneDimFE_ instance to deallocate (inout) + +## Interface 2 + +```fortran +! Method 2: Deallocate a vector of pointers +MODULE SUBROUTINE Deallocate_Ptr_Vector(obj) + TYPE(AbstractOneDimFEPointer_), ALLOCATABLE :: obj(:) +END SUBROUTINE Deallocate_Ptr_Vector +``` + +- `obj`: Vector of AbstractOneDimFEPointer_ to deallocate (inout) diff --git a/docs/docs-api/AbstractOneDimFE/Display.md b/docs/docs-api/AbstractOneDimFE/Display.md new file mode 100644 index 00000000..149f354f --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/Display.md @@ -0,0 +1,30 @@ +# Display + +Displays the content of an `AbstractOneDimFE_` object. + +```fortran +SUBROUTINE AbstractOneDimFEDisplay(obj, msg, unitno, notFull) +``` + +- `obj` - The AbstractOneDimFE_ object to display +- `msg` - Message to display with the object +- `unitno` - Unit number for output (optional) +- `notFull` - If true, displays summarized information (optional) + +## Interface + +Displays the contents of an AbstractOneDimFE_ instance, including its parameters and configuration. + +```fortran +MODULE SUBROUTINE obj_Display(obj, msg, unitno, notFull) + CLASS(AbstractOneDimFE_), INTENT(IN) :: obj + CHARACTER(*), INTENT(IN) :: msg + INTEGER(I4B), OPTIONAL, INTENT(IN) :: unitno + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: notFull +END SUBROUTINE obj_Display +``` + +- `obj`: AbstractOneDimFE_ instance to display (input) +- `msg`: Message to display alongside the content (input) +- `unitno`: Unit number for output (optional, input) +- `notFull`: Flag to control whether to display full content (optional, input) diff --git a/docs/docs-api/AbstractOneDimFE/GetGlobalElemShapeData.md b/docs/docs-api/AbstractOneDimFE/GetGlobalElemShapeData.md new file mode 100644 index 00000000..557f511b --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/GetGlobalElemShapeData.md @@ -0,0 +1,14 @@ +# GetGlobalElemShapeData + +Computes global element shape functions and their derivatives using the geometry of the physical element. + +## Interface + +```fortran +SUBROUTINE obj_GetGlobalElemShapeData(obj, elemsd, xij, geoelemsd) +``` + +- `obj` - The AbstractOneDimFE_ object +- `elemsd` - Element shape data to be filled +- `xij` - Nodal coordinates of the physical element +- `geoelemsd` - Optional geometry element shape data for non-isoparametric elements diff --git a/docs/docs-api/AbstractOneDimFE/GetLocalElemShapeData.md b/docs/docs-api/AbstractOneDimFE/GetLocalElemShapeData.md new file mode 100644 index 00000000..d072ed2f --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/GetLocalElemShapeData.md @@ -0,0 +1,13 @@ +# GetLocalElemShapeData + +Computes local element shape functions and their derivatives at quadrature points. + +## Interface + +```fortran +SUBROUTINE obj_GetLocalElemShapeData(obj, elemsd, quad) +``` + +- `obj` - The AbstractOneDimFE_ object +- `elemsd` - Element shape data to be filled +- `quad` - Quadrature points where shape functions are evaluated diff --git a/docs/docs-api/AbstractOneDimFE/GetParam.md b/docs/docs-api/AbstractOneDimFE/GetParam.md new file mode 100644 index 00000000..63d9db8c --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/GetParam.md @@ -0,0 +1,30 @@ +# GetParam + +Retrieves various parameters from an `AbstractOneDimFE_` object. + +```fortran +SUBROUTINE obj_GetParam(obj, order, fetype, ipType, basisType, alpha, beta, lambda, +refElemDomain, baseContinuity, baseInterpolation, firstCall, isInitiated, +quadratureType, quadratureOrder, quadratureNips, quadratureAlpha, +quadratureBeta, quadratureLambda) +``` + +- `obj` - The AbstractOneDimFE_ object +- `order` - Element order (optional, output) +- `fetype` - Finite element type (optional, output) +- `ipType` - Interpolation point type (optional, output) +- `basisType` - Basis function type (optional, output) +- `alpha` - Jacobi parameter (optional, output) +- `beta` - Jacobi parameter (optional, output) +- `lambda` - Ultraspherical parameter (optional, output) +- `baseContinuity` - Continuity type (optional, output) +- `baseInterpolation` - Interpolation type (optional, output) +- `refElemDomain` - Reference element domain (optional, output) +- `firstCall` - First call flag (optional, output) +- `isInitiated` - Initialization status (optional, output) +- `quadratureType` - Quadrature type (optional, output) +- `quadratureOrder` - Quadrature order (optional, output) +- `quadratureNips` - Number of integration points (optional, output) +- `quadratureAlpha` - Quadrature Jacobi parameter (optional, output) +- `quadratureBeta` - Quadrature Jacobi parameter (optional, output) +- `quadratureLambda` - Quadrature Ultraspherical parameter (optional, output) diff --git a/docs/docs-api/AbstractOneDimFE/GetQuadraturePoints.md b/docs/docs-api/AbstractOneDimFE/GetQuadraturePoints.md new file mode 100644 index 00000000..3334de47 --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/GetQuadraturePoints.md @@ -0,0 +1,36 @@ +# GetQuadraturePoints + +Generates quadrature points and weights for numerical integration on the one-dimensional element. + +```fortran +SUBROUTINE obj_GetQuadraturePoints(obj, quad, quadratureType, order, alpha, beta, lambda) +``` + +## Interface + +Computes and populates the quadrature points for the finite element based on the specified parameters. + +```fortran +MODULE SUBROUTINE obj_GetQuadraturePoints(obj, quad, quadratureType, & + order, alpha, beta, lambda) + CLASS(AbstractOneDimFE_), INTENT(INOUT) :: obj + TYPE(QuadraturePoint_), INTENT(INOUT) :: quad + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureType + INTEGER(I4B), OPTIONAL, INTENT(IN) :: order + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha + REAL(DFP), OPTIONAL, INTENT(IN) :: beta + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda +END SUBROUTINE obj_GetQuadraturePoints +``` + +- `obj`: AbstractOneDimFE_ instance (inout) +- `quad`: Quadrature points to be populated (inout) +- `quadratureType`: Type of quadrature points (optional, input) + - Options: GaussLegendre, GaussLegendreLobatto, GaussLegendreRadau, etc. +- `order`: Order of integrand (optional, input) + - Either the order or the nips should be present + - Both nips and order should not be present +- `alpha`: Jacobi parameter (optional, input) +- `beta`: Jacobi parameter (optional, input) +- `lambda`: Ultraspherical parameter (optional, input) + diff --git a/docs/docs-api/AbstractOneDimFE/Initiate.md b/docs/docs-api/AbstractOneDimFE/Initiate.md new file mode 100644 index 00000000..352ae389 --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/Initiate.md @@ -0,0 +1,78 @@ +# Initiate + +Initiates an instance of the finite element either from a parameter list or from direct parameters. + +```fortran +SUBROUTINE AbstractOneDimFEInitiate(obj, param) +``` + +- `obj` - The AbstractOneDimFE_ object to initialize +- `param` - Parameter list containing element configuration + +Alternative form: + +```fortran +SUBROUTINE AbstractOneDimFEInitiate(obj, baseContinuity, baseInterpolation, +ipType, basisType, alpha, beta, lambda, order, fetype, +quadratureType, quadratureOrder, quadratureNips, +quadratureAlpha, quadratureBeta, quadratureLambda) +``` + +## Interface 1 + +```fortran +! Method 1: Initialize from parameter list +MODULE SUBROUTINE obj_Initiate1(obj, param) + CLASS(AbstractOneDimFE_), INTENT(INOUT) :: obj + TYPE(ParameterList_), INTENT(IN) :: param +END SUBROUTINE obj_Initiate1 +``` + +- `obj`: Finite element object to initialize (inout) +- `param`: Parameter list containing initialization parameters (input) + +## Interface 2 + +```fortran +! Method 2: Initialize from direct parameters +MODULE SUBROUTINE obj_Initiate2(obj, baseContinuity, baseInterpolation, & + ipType, basisType, alpha, beta, lambda, order, fetype, & + quadratureType, quadratureOrder, quadratureNips, & + quadratureAlpha, quadratureBeta, quadratureLambda) + CLASS(AbstractOneDimFE_), INTENT(INOUT) :: obj + CHARACTER(*), INTENT(IN) :: baseContinuity + CHARACTER(*), INTENT(IN) :: baseInterpolation + INTEGER(I4B), OPTIONAL, INTENT(IN) :: ipType + INTEGER(I4B), OPTIONAL, INTENT(IN) :: basisType + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha + REAL(DFP), OPTIONAL, INTENT(IN) :: beta + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda + INTEGER(I4B), OPTIONAL, INTENT(IN) :: order + INTEGER(I4B), OPTIONAL, INTENT(IN) :: fetype + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureType + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureOrder + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureNips(1) + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureAlpha + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureBeta + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureLambda +END SUBROUTINE obj_Initiate2 +``` + +- `obj`: Finite element object to initialize (inout) +- `baseContinuity`: Continuity or Conformity of basis function (input) + - Options: H1* (default), HDiv, HCurl, DG +- `baseInterpolation`: Basis function family used for interpolation (input) + - Options: LagrangeInterpolation, LagrangePolynomial, etc. +- `ipType`: Interpolation point type (optional, input) +- `basisType`: Basis type (optional, input) +- `alpha`: Jacobi parameter (optional, input) +- `beta`: Jacobi parameter (optional, input) +- `lambda`: Ultraspherical parameters (optional, input) +- `order`: Isotropic Order of finite element (optional, input) +- `fetype`: Finite element type (optional, input) +- `quadratureType`: Quadrature type (optional, input) +- `quadratureOrder`: Accuracy of quadrature rule (optional, input) +- `quadratureNips`: Number of integration points (optional, input) +- `quadratureAlpha`: Jacobi parameter for quadrature (optional, input) +- `quadratureBeta`: Jacobi parameter for quadrature (optional, input) +- `quadratureLambda`: Ultraspherical parameter for quadrature (optional, input) diff --git a/docs/docs-api/AbstractOneDimFE/SetAbstractFEParam.md b/docs/docs-api/AbstractOneDimFE/SetAbstractFEParam.md new file mode 100644 index 00000000..0767ef3d --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/SetAbstractFEParam.md @@ -0,0 +1,63 @@ +--- +sidebar_positon: 3 +--- + +# SetAbstractFEParam + +Set the parameters necessary for initiating an `AbstractOneDimFE_` or any of its children. + +## Interface + +```fortran +SUBROUTINE SetAbstractOneDimFEParam(param, prefix, baseContinuity, + baseInterpolation, ipType, basisType, alpha, beta, lambda, order, fetype, + quadratureType, quadratureOrder, quadratureNips, quadratureAlpha, + quadratureBeta, quadratureLambda) +``` + +Sets up the parameter list with values needed to initialize an `AbstractOneDimFE_` object. + +- `param` - ParameterList to be populated with element parameters +- `prefix` - Prefix for parameter names +- `baseContinuity` - Continuity type (H1, HDiv, HCurl, DG) +- `baseInterpolation` - Interpolation type +- `ipType` - Interpolation point type (optional) +- `basisType` - Type of basis functions (optional) +- `alpha` - Jacobi parameter (optional) +- `beta` - Jacobi parameter (optional) +- `lambda` - Ultraspherical parameter (optional) +- `order` - Element order +- `fetype` - Finite element type (optional) +- `quadratureType` - Type of quadrature rule (optional) +- `quadratureOrder` - Order of quadrature rule (optional) +- `quadratureNips` - Number of integration points (optional) +- `quadratureAlpha` - Quadrature Jacobi parameter (optional) +- `quadratureBeta` - Quadrature Jacobi parameter (optional) +- `quadratureLambda` - Quadrature Ultraspherical parameter (optional) + +## Finite elements on Line + +H1 conforming Lagrange polynomials on line: + +- `baseContinuity`: `H1` +- `baseInterpol`: `Lagrange` +- `basisType`: `Monomial`, `Legendre`, `Lobatto`, `Jacobi`, `Ultraspherical` +- `ipType`: `Equidistance`, `LegendreLobatto`, `ChebyshevLobatto`, `UltrasphericalLobatto`, `JacobiLobatto` + +H1 conforming Orthogonal polynomials on line: + +- `baseContinuity`: `H1` +- `baseInterpol`: `Orthogonal` +- `baseType`: `Legendre`, `Lobatto`, `Jacobi`, `Ultraspherical` +- `ipType`: NA + +H1 conforming Hierarchical polynomial on line: + +- `baseContinuity`: `H1` +- `baseInterpol`: `Hierarchy` +- `basisType`: NA +- `ipType`: NA + +- For `baseType=Jacobi`, `alpha` and `beta` should be specified. +- For `baseType=Ultraspherical`, `lambda` should be specified. + diff --git a/docs/docs-api/AbstractOneDimFE/SetAbstractOneDimFEParam.md b/docs/docs-api/AbstractOneDimFE/SetAbstractOneDimFEParam.md new file mode 100644 index 00000000..1bb2a0a8 --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/SetAbstractOneDimFEParam.md @@ -0,0 +1,43 @@ +# SetAbstractOneDimFEParam + +Sets the parameters for initiating abstract finite element. + +## Interface + +```fortran +MODULE SUBROUTINE SetAbstractOneDimFEParam(param, prefix, baseContinuity, & + baseInterpolation, ipType, basisType, alpha, beta, lambda, order, fetype, & + quadratureType, quadratureOrder, quadratureNips, quadratureAlpha, & + quadratureBeta, quadratureLambda) +``` + +## Parameters + +- `param`: ParameterList to be populated (inout) +- `prefix`: String prefix for parameter names (input) +- `order`: Isotropic Order of finite element (input) +- `baseContinuity`: Continuity or Conformity of basis function (input) + - Options: H1* (default), HDiv, HCurl, DG + - Used to determine nodal coordinates of reference element when xij is not present +- `baseInterpolation`: Basis function family used for interpolation (input) + - Options: LagrangeInterpolation, LagrangePolynomial, SerendipityInterpolation, etc. + - Used to determine nodal coordinates of reference element when xij is not present +- `ipType`: Interpolation point type (optional, input) + - Required when baseInterpol is LagrangePolynomial + - Default is Equidistance +- `basisType`: Basis type: Legendre, Lobatto, Ultraspherical, Jacobi, Monomial (optional, input) +- `alpha`: Jacobi parameter (optional, input) +- `beta`: Jacobi parameter (optional, input) +- `lambda`: Ultraspherical parameters (optional, input) +- `fetype`: Finite element type (optional, input) + - Default is Scalar, for HDiv and Hcurl it should be Vector +- `quadratureType`: Quadrature type (optional, input) +- `quadratureOrder`: Accuracy of quadrature rule (optional, input) +- `quadratureNips`: Number of integration points (optional, input) +- `quadratureAlpha`: Jacobi parameter for quadrature (optional, input) +- `quadratureBeta`: Jacobi parameter for quadrature (optional, input) +- `quadratureLambda`: Ultraspherical parameter for quadrature (optional, input) + +## Description + +This subroutine populates a ParameterList_with the required parameters for initializing an AbstractOneDimFE_ object. diff --git a/docs/docs-api/AbstractOneDimFE/SetOrder.md b/docs/docs-api/AbstractOneDimFE/SetOrder.md new file mode 100644 index 00000000..6ca493f1 --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/SetOrder.md @@ -0,0 +1,12 @@ +# SetOrder + +```fortran +SUBROUTINE obj_SetOrder(obj, order) +``` + +Changes the order of an already initialized `AbstractOneDimFE_` object and reallocates internal data as needed. + +#### Arguments + +- `obj` - The AbstractOneDimFE_ object +- `order` - The new element order diff --git a/docs/docs-api/AbstractOneDimFE/SetParam.md b/docs/docs-api/AbstractOneDimFE/SetParam.md new file mode 100644 index 00000000..a01de75d --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/SetParam.md @@ -0,0 +1,33 @@ +# SetParam + +Sets various parameters of an `AbstractOneDimFE_` object. + +## Interface + +```fortran +SUBROUTINE obj_SetParam(obj, order, fetype, ipType, basisType, alpha, beta, lambda, +refElemDomain, baseContinuity, baseInterpolation, firstCall, +quadratureType, quadratureOrder, quadratureNips, quadratureAlpha, +quadratureBeta, quadratureLambda) +``` + +- `obj` - The AbstractOneDimFE_ object +- `order` - Element order (optional) +- `fetype` - Finite element type (optional) +- `ipType` - Interpolation point type (optional) +- `basisType` - Basis function type (optional) +- `alpha` - Jacobi parameter (optional) +- `beta` - Jacobi parameter (optional) +- `lambda` - Ultraspherical parameter (optional) +- `baseContinuity` - Continuity type (optional) +- `baseInterpolation` - Interpolation type (optional) +- `refElemDomain` - Reference element domain (optional) +- `firstCall` - First call flag (optional) +- `quadratureType` - Quadrature type (optional) +- `quadratureOrder` - Quadrature order (optional) +- `quadratureNips` - Number of integration points (optional) +- `quadratureAlpha` - Quadrature Jacobi parameter (optional) +- `quadratureBeta` - Quadrature Jacobi parameter (optional) +- `quadratureLambda` - Quadrature Ultraspherical parameter (optional) + + diff --git a/docs/docs-api/AbstractOneDimFE/index.md b/docs/docs-api/AbstractOneDimFE/index.md new file mode 100644 index 00000000..7eb04ecc --- /dev/null +++ b/docs/docs-api/AbstractOneDimFE/index.md @@ -0,0 +1,78 @@ +--- +tags: + - "finiteElement" + - "polynomials" + - "basis" + - "shapeFunctions" + - "shape-functions" +category: + - "FiniteElement" +date: 1692028800 +docs: "done" +extpkgs: "none" +sidebar_position: 1 +status: "stable" +update: 1692028800 +--- + +# AbstractOneDimFE + +`AbstractOneDimFE_` is an abstract data type that provides a base for one-dimensional finite elements. + +`AbstractOneDimFE_Class` is a module that defines the abstract base class for one-dimensional finite elements in the EASIFEM library. It provides the foundation for implementing various types of one-dimensional elements with different basis functions, interpolation schemes, and continuity requirements. + +The module contains: + +- The abstract `AbstractOneDimFE_` class +- A pointer wrapper type `AbstractOneDimFEPointer_` +- Various interfaces for element construction, manipulation, and analysis + +## Key Features + +- Supports various basis function types (Lagrange, Hierarchical, Orthogonal, etc.) +- Handles different interpolation schemes +- Provides quadrature rules for numerical integration +- Supports various continuity requirements (H1, HDiv, HCurl, DG) +- Manages local and global element shape functions + +import EXAMPLE20 from "./AbstractOneDimFE_.md"; + + + +## Summary of methods + +### Constructor Methods + +- `Initiate(param)` - Initialize from parameter list +- `Initiate(baseContinuity, baseInterpolation, ...)` - Initialize from individual parameters +- `Copy(obj2)` - Initialize by copying from another instance +- `CheckEssentialParam(param)` - Check for essential parameters in parameter list +- `DEALLOCATE()` - Free resources used by the object + +### I/O Methods + +- `Display(msg, unitno, notFull)` - Display the content of the object +- `MdEncode()` - Return a markdown representation of the object +- `ReactEncode()` - Return a React component representation of the object + +### Set Methods + +- `SetParam(order, fetype, ipType, ...)` - Set various parameters of the element +- `SetOrder(order)` - Change the order of an already initialized element + +### Get Methods + +- `GetPrefix()` - Abstract method that returns a prefix string for the element type +- `GetLocalElemShapeData(elemsd, quad)` - Get local element shape functions and derivatives +- `GetGlobalElemShapeData(elemsd, xij, geoelemsd)` - Get global element shape functions +- `GetParam(order, fetype, ...)` - Get various parameters from the element + +### Quadrature Methods + +- `GetQuadraturePoints(quad, quadratureType, ...)` - Generate quadrature points for integration + +## All methods + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/docs-api/BasisOpt/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/BasisOpt/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..31b6d661 --- /dev/null +++ b/docs/docs-api/BasisOpt/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,32 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-12 +! summary: testing import from toml + +PROGRAM main + +USE GlobalData +USE BasisOpt_Class +USE BaseType, ONLY: varopt => TypeFEVariableOpt, & + elemnameopt => TypeElemNameOpt, & + ipopt => TypeInterpolationOpt, & + polyopt => TypePolynomialOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +! Internal variables +TYPE(BasisOpt_) :: obj +CHARACTER(*), PARAMETER :: toml_filename = "./toml/BasisOpt.toml" + +! tests starts here +! CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 + +CONTAINS + +SUBROUTINE test1 + CALL obj%ImportFromToml(filename=toml_filename, tomlName='test1') + CALL obj%Display("BasisOpt: ") +END SUBROUTINE test1 + +END PROGRAM main + diff --git a/docs/docs-api/BasisOpt/examples/_Initiate_test_1.F90 b/docs/docs-api/BasisOpt/examples/_Initiate_test_1.F90 new file mode 100644 index 00000000..5aa0efb9 --- /dev/null +++ b/docs/docs-api/BasisOpt/examples/_Initiate_test_1.F90 @@ -0,0 +1,36 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-12 +! summary: Initiate BasisOpt + +PROGRAM main + +USE GlobalData +USE BasisOpt_Class +USE BaseType, ONLY: varopt => TypeFEVariableOpt, & + elemnameopt => TypeElemNameOpt, & + ipopt => TypeInterpolationOpt, & + polyopt => TypePolynomialOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +TYPE(BasisOpt_) :: obj +INTEGER(I4B) :: basisType(3), order, anisoOrder(3) + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +basisType = polyopt%monomial + +CALL obj%Initiate(elemType=elemnameopt%triangle, nsd=2, & + baseContinuity="H1", & + baseInterpolation="LAGR", ipType=ipopt%equidistance, & + basisType=basisType, feType=varopt%scalar) + +order = 1 +CALL obj%SetOrder(order=order, errCheck=.TRUE.) + +anisoOrder = 1 +CALL obj%SetOrder(anisoOrder=anisoOrder, errCheck=.TRUE.) + +CALL obj%Display("BasisOpt: ") + +END PROGRAM main + diff --git a/docs/docs-api/BasisOpt/examples/_Initiate_test_2.F90 b/docs/docs-api/BasisOpt/examples/_Initiate_test_2.F90 new file mode 100644 index 00000000..31b17e1b --- /dev/null +++ b/docs/docs-api/BasisOpt/examples/_Initiate_test_2.F90 @@ -0,0 +1,39 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-12 +! summary: Initiate BasisOpt for Hierarchical polynomial + +PROGRAM main + +USE GlobalData +USE BasisOpt_Class +USE BaseType, ONLY: varopt => TypeFEVariableOpt, & + elemnameopt => TypeElemNameOpt, & + ipopt => TypeInterpolationOpt, & + polyopt => TypePolynomialOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +TYPE(BasisOpt_) :: obj +INTEGER(I4B) :: basisType(3), order, anisoOrder(3) + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +basisType = polyopt%monomial + +CALL obj%Initiate(elemType=elemnameopt%triangle, nsd=2, & + baseContinuity="H1", & + baseInterpolation="HIER", & + feType=varopt%scalar) + +! order = 1 +! CALL obj%SetOrder(order=order, errCheck=.TRUE.) + +! order = 1 +! CALL obj%SetOrder(order=order, errCheck=.FALSE.) + +anisoOrder = 1 +CALL obj%SetOrder(anisoOrder=anisoOrder, errCheck=.TRUE.) + +CALL obj%Display("BasisOpt: ") + +END PROGRAM main + diff --git a/docs/docs-api/BasisOpt/examples/runner.toml b/docs/docs-api/BasisOpt/examples/runner.toml new file mode 100644 index 00000000..8a2c9cdd --- /dev/null +++ b/docs/docs-api/BasisOpt/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType="Debug" +BuildDir="/tmp/easifem-tests/BasisOpt/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/BasisOpt/examples/toml/BasisOpt.toml b/docs/docs-api/BasisOpt/examples/toml/BasisOpt.toml new file mode 100644 index 00000000..476cbead --- /dev/null +++ b/docs/docs-api/BasisOpt/examples/toml/BasisOpt.toml @@ -0,0 +1,52 @@ +[test1] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +basisType = "Monomial" +ipType = "Equidistance" +feType = "Scalar" +order = 1 +#quadrature related +quadOptName = "quadOpt" + +[test1.quadOpt] +isHomogeneous = true +# Is all direction need same type of quadrature and accuracy + +quadratureType = "GaussLegendre" +# quadratureType can be a vector of size 3 +# if it is a vector (max size 3), then it represents the type of quadrature +# in x, y, and z directions + +order = 2 +# order is optional, it can be a vector of size 3 +# when order is a vector, then it represents the order of accuracy in x, y, and z directions + +# nips = 3 +# number of integration points in each direction +# it can be a vector of size 3, like order +# either nips or order should be present, not both + +# nsd = 2 +# number of spatial dimensions, it is also optional +# we can set it at FEDOF level while calling importFromToml method + +# topoType = "Line" +# This is also optional, it is used to set the topology type +# We can set it at FEDOF level while calling importFromToml method + +# alpha = 0.0 +# Jacobi parameter, it is used for Jacobi quadrature +# It can be a vector of size 3, in this case it represents the Jacobi parameter in x, y, and z directions + +# beta = 0.0 +# Jacobi parameter, it is used for Jacobi quadrature +# It can be a vector of size 3, in this case it represents the Jacobi parameter in x, y, and z directions + +# lambda = 0.5 +# Ultraspherical polynomial parameter, it is used for Ultraspherical quadrature +# It can be a vector of size 3, in this case it represents the Ultraspherical parameter in x, y, and z directions + + + + + diff --git a/docs/docs-api/BasisOpt/index.md b/docs/docs-api/BasisOpt/index.md new file mode 100644 index 00000000..3780cf97 --- /dev/null +++ b/docs/docs-api/BasisOpt/index.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 1 +date: 2025-07-12 +status: stable +docs: done +extpkgs: none +category: + - Basis + - Finite-Element +tags: + - basis + - finite-element +--- + +# BasisOpt + +`BasisOpt_` contains the option for basis functions. + +## All methods + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..44bbb8e4 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,64 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing import from toml + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE BlockNodeField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE TimeFEDOF_Class +USE TimeOpt_Class, ONLY: TimeOpt_, TypeTimeOpt + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/BlockNodeField.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof +TYPE(BlockNodeField_) :: obj +TYPE(TimeFEDOF_) :: timefedof +TYPE(HDF5File_) :: meshfile +TYPE(TimeOpt_) :: timeopt + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL timeopt%ImportFromToml(tomlName="timeOpt", & + filename=tomlfilename) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + timefedof=timefedof, & + mesh=mesh, & + timeOpt=timeopt) + +CALL obj%Display("ScalarField obj:") + +! CALL timefedof%Display("TimeFEDOF obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL fedof%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_2.F90 b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_2.F90 new file mode 100644 index 00000000..6722c6d3 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_2.F90 @@ -0,0 +1,53 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-05 +! summary: Testing import from toml + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE BlockNodeField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/BlockNodeField2.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof +TYPE(BlockNodeField_) :: obj +TYPE(HDF5File_) :: meshfile + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + mesh=mesh) + +CALL obj%Display("ScalarField obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL fedof%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_3.F90 b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_3.F90 new file mode 100644 index 00000000..b051e230 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_3.F90 @@ -0,0 +1,52 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-05 +! summary: Testing import from toml + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE BlockNodeField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/BlockNodeField3.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOFPointer_), ALLOCATABLE :: fedof(:) +TYPE(BlockNodeField_) :: obj +TYPE(HDF5File_) :: meshfile + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + mesh=mesh) + +CALL obj%Display("ScalarField obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_4.F90 b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_4.F90 new file mode 100644 index 00000000..45916034 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/_ImportFromToml_test_4.F90 @@ -0,0 +1,52 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-05 +! summary: Testing import from toml + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE BlockNodeField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/BlockNodeField4.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOFPointer_), ALLOCATABLE :: fedof(:) +TYPE(BlockNodeField_) :: obj +TYPE(HDF5File_) :: meshfile + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + mesh=mesh) + +CALL obj%Display("ScalarField obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/BlockNodeField/examples/runner.toml b/docs/docs-api/BlockNodeField/examples/runner.toml new file mode 100644 index 00000000..034f4f91 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/BlockNodeField" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField.toml b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField.toml new file mode 100644 index 00000000..ff7d0996 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField.toml @@ -0,0 +1,36 @@ +[timeOpt] +dt = 0.1 +timeDependency = "Transient" +totalTimeSteps = 10 +startTime = 0.0 +endTime = 1.0 + +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +physicalVarNames = ["u", "p"] +spaceCompo = [2, 1] +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +timefedofName = "time" +# timefedofName contains the name of the subtable which +# contains the timefedof data for this field. + +[field1.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 + +[field1.time] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 diff --git a/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField2.toml b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField2.toml new file mode 100644 index 00000000..c975859d --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField2.toml @@ -0,0 +1,19 @@ +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +physicalVarNames = ["u", "p"] +spaceCompo = [2, 1] +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +[field1.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 diff --git a/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField3.toml b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField3.toml new file mode 100644 index 00000000..57fddea2 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField3.toml @@ -0,0 +1,29 @@ +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +physicalVarNames = ["u", "p"] +spaceCompo = [2, 1] +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +[field1.u] +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +[field1.u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 2 + +[field1.p] +fedofName = "space" + +[field1.p.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 diff --git a/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField4.toml b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField4.toml new file mode 100644 index 00000000..3dd9a032 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField4.toml @@ -0,0 +1,43 @@ +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +physicalVarNames = ["u", "p"] +spaceCompo = [2, 1] +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +[field1.u] +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. +timefedofName = "time" + +[field1.u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 2 + +[field1.u.time] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 2 + +[field1.p] +fedofName = "space" +timefedofName = "time" + +[field1.p.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 + +[field1.p.time] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 diff --git a/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField5.toml b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField5.toml new file mode 100644 index 00000000..2fae08c3 --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/toml/BlockNodeField5.toml @@ -0,0 +1,44 @@ +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +physicalVarNames = ["u", "p"] +spaceCompo = [2, 1] +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +[field1.u] +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +[field1.u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 2 +spaceCompo = 2 + +[field1.u.analytical] +name = "exactVel" +returnType = "Scalar" +argType = "SpaceTime" +numArgs = 2 +numReturns = 1 +luaScript = "./functions.lua" +luaFunctionName = "referenceVel" +plotWithResult = false +plotErrorNorm = false +errorNorm = false +normType = "L2BO" + +[field1.p] +fedofName = "space" + +[field1.p.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 +spaceCompo = 1 diff --git a/docs/docs-api/BlockNodeField/examples/toml/functions.lua b/docs/docs-api/BlockNodeField/examples/toml/functions.lua new file mode 100644 index 00000000..49657edd --- /dev/null +++ b/docs/docs-api/BlockNodeField/examples/toml/functions.lua @@ -0,0 +1,64 @@ +function velocityLeft(t) + return 0.0 +end + +function velocityRight(t) + local f = 1.0 + local t0 = 1.0 + local amp = 1.0 + return amp*(2.0*(math.pi*f)^2)*(t-t0)*math.exp(-((math.pi) * f *(t-t0))^2)*(2.0 * ((math.pi) * f *(t-t0))^2-3.0) +end + +function initialVel(x) + return 0.0 +end + +function initialDisp(x) + return 0.0 +end + +function referenceDisp(x,t) + local pi = math.pi + local f = 1.0 + local t0 = 1.0 + local amp = 1.0 + local L = 10.0 + local c = 1.0 + + return amp * (1.0 - 2.0 * (pi * f*(x -L+ c*(t -t0)))^2) * math.exp(-(pi * f *(x-L + c*(t -t0)))^2) +end + + +function referenceVel(x,t) + local pi = math.pi + local f = 1.0 + local t0 = 1.0 + local amp = 1.0 + local L = 10.0 + local c = 1.0 + + return amp * 2.0*((pi*f)^2)*(x -L + c*(t -t0))*math.exp(-(pi * f *(x -L + c*(t -t0)))^2)*(2.0 * (pi * f *(x -L + c*(t -t0)))^2-3.0) +end + +-- function bodyForce(x, t) +-- local E = 2.0 +-- local r = 1.0 +-- local b0 = (E - r) / r +-- local two_pi = 2.0 * math.pi +-- local four_pi_sqr = 4.0 * math.pi * math.pi +-- return b0 * four_pi_sqr * math.sin(two_pi * (t - x)) +-- end + +-- function tractionRight(t) +-- local amp = 1.0 +-- local t0 = 0.0 +-- local omega = 1.0 + +-- if t <= 5e-3 then +-- return amp*math.sin(omega*t - t0) + +-- else +-- return 0.0 +-- end +-- end + diff --git a/docs/docs-api/BlockNodeField/index.md b/docs/docs-api/BlockNodeField/index.md index e9d8f4e7..fffbbb1b 100644 --- a/docs/docs-api/BlockNodeField/index.md +++ b/docs/docs-api/BlockNodeField/index.md @@ -18,6 +18,8 @@ tags: # BlockNodeField +## All methods + import DocCardList from '@theme/DocCardList'; diff --git a/docs/docs-api/CSRMatrix/examples/_SetToSTMatrix_test_1.F90 b/docs/docs-api/CSRMatrix/examples/_SetToSTMatrix_test_1.F90 new file mode 100644 index 00000000..111bbf51 --- /dev/null +++ b/docs/docs-api/CSRMatrix/examples/_SetToSTMatrix_test_1.F90 @@ -0,0 +1,64 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-11-20 +! summary: Testing SetToSTMatrix method + +PROGRAM main +USE GlobalData +USE BaseType +USE CSRMatrix_Method +USE DOF_Method +USE Display_Method + +IMPLICIT NONE +TYPE(CSRMatrix_) :: obj, VALUE +TYPE(DOF_) :: dofvalue, dofobj +REAL(DFP), ALLOCATABLE :: valueMat(:, :), objMat(:, :) + +CALL Initiate(obj=dofvalue, tNodes=[4], names=['K'], & + spaceCompo=[1], timeCompo=[1], storageFMT=FMT_DOF) + +CALL Initiate(obj=VALUE, ncol=(.tnodes.dofvalue), & + nrow=(.tnodes.dofvalue), idof=dofvalue, jdof=dofvalue) + +CALL Initiate(obj=dofobj, tNodes=[4], names=['K'], & + spaceCompo=[1], timeCompo=[2], storageFMT=FMT_DOF) + +CALL Initiate(obj=obj, ncol=(.tnodes.dofobj), & + nrow=(.tnodes.dofobj), idof=dofobj, jdof=dofobj) + +CALL Setsparsity(VALUE, 1, [1, 2]) +CALL Setsparsity(VALUE, 2, [1, 2, 3]) +CALL Setsparsity(VALUE, 3, [2, 3, 4]) +CALL Setsparsity(VALUE, 4, [3, 4]) +CALL SetSparsity(VALUE) + +CALL Set(VALUE, 1, 1, 1.0_DFP) +CALL Set(VALUE, 1, 2, 2.0_DFP) +CALL Set(VALUE, 2, 1, 3.0_DFP) +CALL Set(VALUE, 2, 2, 4.0_DFP) +CALL Set(VALUE, 2, 3, 5.0_DFP) +CALL Set(VALUE, 3, 2, 6.0_DFP) +CALL Set(VALUE, 3, 3, 7.0_DFP) +CALL Set(VALUE, 3, 4, 8.0_DFP) +CALL Set(VALUE, 4, 3, 9.0_DFP) +CALL Set(VALUE, 4, 4, 10.0_DFP) + +CALL Setsparsity(obj, 1, [1, 2]) +CALL Setsparsity(obj, 2, [1, 2, 3]) +CALL Setsparsity(obj, 3, [2, 3, 4]) +CALL Setsparsity(obj, 4, [3, 4]) +CALL SetSparsity(obj) + +CALL SetToSTMatrix(obj=obj, VALUE=VALUE, & + itimecompo=2, jtimecompo=1, scale=1.0_DFP) +! obj = 2.0_DFP + +valueMat = VALUE +CALL Display(valueMat, "valueMat: ", full=.TRUE.) + +objMat = obj +CALL Display(objMat, "objMat: ", full=.TRUE.) + +CALL DEALLOCATE (obj) +CALL DEALLOCATE (VALUE) +END PROGRAM main diff --git a/docs/docs-api/CSRMatrix/examples/_SetToSTMatrix_test_2.F90 b/docs/docs-api/CSRMatrix/examples/_SetToSTMatrix_test_2.F90 new file mode 100644 index 00000000..1438ffa5 --- /dev/null +++ b/docs/docs-api/CSRMatrix/examples/_SetToSTMatrix_test_2.F90 @@ -0,0 +1,97 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-11-20 +! summary: Testing SetToSTMatrix method + +PROGRAM main +USE GlobalData +USE BaseType +USE CSRMatrix_Method +USE DOF_Method +USE Display_Method + +IMPLICIT NONE +TYPE(CSRMatrix_) :: obj, VALUE +TYPE(DOF_) :: dofvalue, dofobj +REAL(DFP), ALLOCATABLE :: valueMat(:, :), objMat(:, :) + +CALL Initiate(obj=dofvalue, tNodes=[4], names=['K'], & + spaceCompo=[2], timeCompo=[1], storageFMT=FMT_DOF) + +CALL Initiate(obj=VALUE, ncol=(.tnodes.dofvalue), & + nrow=(.tnodes.dofvalue), idof=dofvalue, jdof=dofvalue) + +CALL Initiate(obj=dofobj, tNodes=[4], names=['K'], & + spaceCompo=[2], timeCompo=[2], storageFMT=FMT_DOF) + +CALL Initiate(obj=obj, ncol=(.tnodes.dofobj), & + nrow=(.tnodes.dofobj), idof=dofobj, jdof=dofobj) + +CALL Setsparsity(VALUE, 1, [1, 2]) +CALL Setsparsity(VALUE, 2, [1, 2, 3]) +CALL Setsparsity(VALUE, 3, [2, 3, 4]) +CALL Setsparsity(VALUE, 4, [3, 4]) +CALL SetSparsity(VALUE) + +CALL Set(VALUE, 1, 1, 1, 1, 1.0_DFP) +CALL Set(VALUE, 1, 2, 1, 1, 2.0_DFP) +CALL Set(VALUE, 2, 1, 1, 1, 3.0_DFP) +CALL Set(VALUE, 2, 2, 1, 1, 4.0_DFP) +CALL Set(VALUE, 2, 3, 1, 1, 5.0_DFP) +CALL Set(VALUE, 3, 2, 1, 1, 6.0_DFP) +CALL Set(VALUE, 3, 3, 1, 1, 7.0_DFP) +CALL Set(VALUE, 3, 4, 1, 1, 8.0_DFP) +CALL Set(VALUE, 4, 3, 1, 1, 9.0_DFP) +CALL Set(VALUE, 4, 4, 1, 1, 10.0_DFP) + +CALL Set(VALUE, 1, 1, 1, 2, 11.0_DFP) +CALL Set(VALUE, 1, 2, 1, 2, 12.0_DFP) +CALL Set(VALUE, 2, 1, 1, 2, 13.0_DFP) +CALL Set(VALUE, 2, 2, 1, 2, 14.0_DFP) +CALL Set(VALUE, 2, 3, 1, 2, 15.0_DFP) +CALL Set(VALUE, 3, 2, 1, 2, 16.0_DFP) +CALL Set(VALUE, 3, 3, 1, 2, 17.0_DFP) +CALL Set(VALUE, 3, 4, 1, 2, 18.0_DFP) +CALL Set(VALUE, 4, 3, 1, 2, 19.0_DFP) +CALL Set(VALUE, 4, 4, 1, 2, 20.0_DFP) + +CALL Set(VALUE, 1, 1, 2, 1, 21.0_DFP) +CALL Set(VALUE, 1, 2, 2, 1, 22.0_DFP) +CALL Set(VALUE, 2, 1, 2, 1, 23.0_DFP) +CALL Set(VALUE, 2, 2, 2, 1, 24.0_DFP) +CALL Set(VALUE, 2, 3, 2, 1, 25.0_DFP) +CALL Set(VALUE, 3, 2, 2, 1, 26.0_DFP) +CALL Set(VALUE, 3, 3, 2, 1, 27.0_DFP) +CALL Set(VALUE, 3, 4, 2, 1, 28.0_DFP) +CALL Set(VALUE, 4, 3, 2, 1, 29.0_DFP) +CALL Set(VALUE, 4, 4, 2, 1, 30.0_DFP) + +CALL Set(VALUE, 1, 1, 2, 2, 31.0_DFP) +CALL Set(VALUE, 1, 2, 2, 2, 32.0_DFP) +CALL Set(VALUE, 2, 1, 2, 2, 33.0_DFP) +CALL Set(VALUE, 2, 2, 2, 2, 34.0_DFP) +CALL Set(VALUE, 2, 3, 2, 2, 35.0_DFP) +CALL Set(VALUE, 3, 2, 2, 2, 36.0_DFP) +CALL Set(VALUE, 3, 3, 2, 2, 37.0_DFP) +CALL Set(VALUE, 3, 4, 2, 2, 38.0_DFP) +CALL Set(VALUE, 4, 3, 2, 2, 39.0_DFP) +CALL Set(VALUE, 4, 4, 2, 2, 40.0_DFP) + +CALL Setsparsity(obj, 1, [1, 2]) +CALL Setsparsity(obj, 2, [1, 2, 3]) +CALL Setsparsity(obj, 3, [2, 3, 4]) +CALL Setsparsity(obj, 4, [3, 4]) +CALL SetSparsity(obj) + +CALL SetToSTMatrix(obj=obj, VALUE=VALUE, & + itimecompo=2, jtimecompo=1, scale=1.0_DFP) +! obj = 2.0_DFP + +valueMat = VALUE +CALL Display(valueMat, "valueMat: ", full=.TRUE.) + +objMat = obj +CALL Display(objMat, "objMat: ", full=.TRUE.) + +CALL DEALLOCATE (obj) +CALL DEALLOCATE (VALUE) +END PROGRAM main diff --git a/docs/docs-api/CSRMatrix/examples/runner.toml b/docs/docs-api/CSRMatrix/examples/runner.toml index c067d840..d9884ae1 100644 --- a/docs/docs-api/CSRMatrix/examples/runner.toml +++ b/docs/docs-api/CSRMatrix/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/csrmatrix/" +BuildDir = "/tmp/easifem-tests/csrmatrix/" TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/ElemshapeData/Initiate.md b/docs/docs-api/ElemshapeData/Initiate.md index c7e6055b..fd83ec68 100644 --- a/docs/docs-api/ElemshapeData/Initiate.md +++ b/docs/docs-api/ElemshapeData/Initiate.md @@ -2,11 +2,11 @@ We can construct an instance of `ElemshapeData` by using a generic method called `Initiate()`. There are several ways to construct the instance. You can learn about this method from following examples. -Interface-1: +## Interface 1 ```fortran MODULE SUBROUTINE Initiate(obj, quad, refElem, continuityType, & - & interpolType) + interpolType) CLASS(ElemshapeData_), INTENT(INOUT) :: obj !! ElemshapeData to be formed CLASS(QuadraturePoint_), INTENT(IN) :: quad @@ -20,18 +20,18 @@ MODULE SUBROUTINE Initiate(obj, quad, refElem, continuityType, & END SUBROUTINE Initiate ``` -Interface-2: +## Interface 2 ```fortran -MODULE SUBROUTINE Initiate( obj1, obj2 ) - TYPE(ElemshapeData_), INTENT( INOUT ) :: obj1 - TYPE(ElemshapeData_), INTENT( IN ) :: obj2 +MODULE SUBROUTINE Initiate(obj1, obj2) + TYPE(ElemshapeData_), INTENT(INOUT) :: obj1 + TYPE(ElemshapeData_), INTENT(IN) :: obj2 END SUBROUTINE Initiate ``` In interface-2, we copy an instance of ElemshapeData into another instance of same class. This method is used for extending the [[#Assignment(=)]] operator. -Interface-3: +## Interface 3 ```fortran MODULE PURE SUBROUTINE Initiate(obj, elemsd) @@ -49,42 +49,42 @@ END SUBROUTINE Initiate - $\frac{dT}{d\theta}$ - This routine uses `elemsd` to set `obj%T`, `obj%dTdTheta`, `obj%Jt`, `obj%Wt`, `obj%Theta`. -### Assignment(=) +## Assignment(=) ```fortran -MODULE SUBROUTINE Initiate( obj1, obj2 ) - TYPE(ElemshapeData_), INTENT( INOUT ) :: obj1 - TYPE(ElemshapeData_), INTENT( IN ) :: obj2 +MODULE SUBROUTINE Initiate(obj1, obj2) + TYPE(ElemshapeData_), INTENT(INOUT) :: obj1 + TYPE(ElemshapeData_), INTENT(IN) :: obj2 END SUBROUTINE Initiate ``` ```fortran -MODULE SUBROUTINE Initiate( obj1, obj2 ) - TYPE(ElemshapeData_), INTENT( INOUT ) :: obj1 - TYPE(STElemshapeData_), INTENT( IN ) :: obj2 +MODULE SUBROUTINE Initiate(obj1, obj2) + TYPE(ElemshapeData_), INTENT(INOUT) :: obj1 + TYPE(STElemshapeData_), INTENT(IN) :: obj2 END SUBROUTINE Initiate ``` ```fortran -MODULE SUBROUTINE Initiate( obj1, obj2 ) - TYPE(STElemshapeData_), INTENT( INOUT ) :: obj1 - TYPE(ElemshapeData_), INTENT( IN ) :: obj2 +MODULE SUBROUTINE Initiate(obj1, obj2) + TYPE(STElemshapeData_), INTENT(INOUT) :: obj1 + TYPE(ElemshapeData_), INTENT(IN) :: obj2 END SUBROUTINE Initiate ``` ```fortran -MODULE SUBROUTINE Initiate( obj1, obj2 ) - TYPE(STElemshapeData_), INTENT( INOUT ) :: obj1 - TYPE(STElemshapeData_), INTENT( IN ) :: obj2 +MODULE SUBROUTINE Initiate(obj1, obj2) + TYPE(STElemshapeData_), INTENT(INOUT) :: obj1 + TYPE(STElemshapeData_), INTENT(IN) :: obj2 END SUBROUTINE Initiate ``` -## Example: shape functions on line element +## Examples: shape functions on line element -import EXAMPLE85 from "./examples/_Initiate_test_1a.md"; +import EXAMPLE85 from "./examples/_Initiate_test_1.md"; diff --git a/docs/docs-api/ElemshapeData/examples/_ElemshapeData_test_21.md b/docs/docs-api/ElemshapeData/examples/_ElemshapeData_test_21.md deleted file mode 100644 index e6b107ec..00000000 --- a/docs/docs-api/ElemshapeData/examples/_ElemshapeData_test_21.md +++ /dev/null @@ -1,99 +0,0 @@ -This example demonstrates how to USE the `GetInterpolation` method for scalar variable. - -## Modules and classes - -- [[ElemshapeData_]] -- [[QuadraturePoint_]] -- [[ReferenceQuadrangle_]] -- [[FEVariable_]] - -## Usage - -!!! note "" -IMPORT modules and declare variables - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE( ElemshapeData_ ) :: obj - TYPE( QuadraturePoint_ ) :: quad - TYPE( ReferenceQuadrangle_ ) :: refelem - TYPE( FEVariable_ ) :: var1, var2, var3 - INTEGER( I4B ), PARAMETER :: nsd=2, order=2 - REAL( DFP ), PARAMETER :: xij(2,4) = RESHAPE( & - & [-1.0,-1.0, & - & 1.0,-1.0, & - & 1.0, 1.0, & - & -1.0, 1.0], [2,4]) - INTEGER(I4B) :: ii -``` - -!!! note "" -Initiate an instance of [[ReferenceQuadrangle_]] - -```fortran -refelem = ReferenceQuadrangle( nsd = nsd ) -``` - -!!! note "" -Initiate Gauss-Legendre Quadrature points. - -```fortran -CALL Initiate(obj=quad, refelem=refelem, order=order, & - & quadratureType='GaussLegendre') -``` - -!!! note "" -Initiate an instance of [[ElemshapeData_]] for [[ReferenceQuadrangle_]]. The code shown below ONLY initiates the local shape FUNCTION DATA. - -```fortran -CALL Initiate( obj = obj, quad = quad, refelem = refelem, & - & ContinuityType= typeH1, InterpolType = TypeLagrangeInterpolation ) -CALL Set( obj=obj, val=xij, N=obj%N, dNdXi=obj%dNdXi ) -``` - -!!! note "GetInterpolation" -Scalar variable, constant. - -```fortran -var1 = NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL GetInterpolation(obj=obj, interpol=var2, val=var1) -CALL Display( var2, "scalar+constant") -``` - -```fortran -var1 = NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(Interpolation(obj=obj, val=var1), "scalar+constant") -``` - -!!! note "GetInterpolation" -Scalar variable, space. - -```fortran -var1 = NodalVariable( ones(4, 1.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) -CALL GetInterpolation(obj=obj, interpol=var2, val=var1) -CALL Display( var2, "scalar+space") -``` - -```fortran -var1 = NodalVariable( ones(4, 1.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) -CALL Display(Interpolation(obj=obj, val=var1), "scalar+space") -``` - -!!! settings "Cleanup" - -```fortran - CALL DEALLOCATE( obj ) - CALL DEALLOCATE( var1 ) - CALL DEALLOCATE( var2 ) -END PROGRAM main -``` diff --git a/docs/docs-api/ElemshapeData/examples/_ElemshapeData_test_22.md b/docs/docs-api/ElemshapeData/examples/_ElemshapeData_test_22.md deleted file mode 100644 index 68a4d5cd..00000000 --- a/docs/docs-api/ElemshapeData/examples/_ElemshapeData_test_22.md +++ /dev/null @@ -1,88 +0,0 @@ -This example demonstrates how to USE the `GetInterpolation` method for vector variable. - -## Modules and classes - -- [[ElemshapeData_]] -- [[QuadraturePoint_]] -- [[ReferenceQuadrangle_]] -- [[FEVariable_]] - -## Usage - -!!! note "" -IMPORT modules and declare variables - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE( ElemshapeData_ ) :: obj - TYPE( QuadraturePoint_ ) :: quad - TYPE( ReferenceQuadrangle_ ) :: refelem - TYPE( FEVariable_ ) :: var1, var2, var3 - INTEGER( I4B ), PARAMETER :: nsd=2, order=2 - REAL( DFP ), PARAMETER :: xij(2,4) = RESHAPE( & - & [-1.0,-1.0, & - & 1.0,-1.0, & - & 1.0, 1.0, & - & -1.0, 1.0], [2,4]) - INTEGER(I4B) :: ii -``` - -!!! note "" -Initiate an instance of [[ReferenceQuadrangle_]] - -```fortran -refelem = ReferenceQuadrangle( nsd = nsd ) -``` - -!!! note "" -Initiate Gauss-Legendre Quadrature points. - -```fortran -CALL Initiate(obj=quad, refelem=refelem, order=order, & - & quadratureType='GaussLegendre') -``` - -!!! note "" -Initiate an instance of [[ElemshapeData_]] for [[ReferenceQuadrangle_]]. The code shown below ONLY initiates the local shape FUNCTION DATA. - -```fortran -CALL Initiate( obj = obj, quad = quad, refelem = refelem, & - & ContinuityType= typeH1, InterpolType = TypeLagrangeInterpolation ) -CALL Set( obj=obj, val=xij, N=obj%N, dNdXi=obj%dNdXi ) -``` - -!!! note "GetInterpolation" -Vector variable, constant. - -```fortran -var1 = NodalVariable( ones(2, 1.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL GetInterpolation(obj=obj, interpol=var2, val=var1) -CALL Display( var2, "Vector + constant") -CALL Display( Interpolation(obj, var1), "Vector + constant") -``` - -!!! note "GetInterpolation" -Vector variable, space. - -```fortran -var1 = NodalVariable( reshape([1.0_DFP, 1.0_DFP, 1.0_DFP, 1.0_DFP, & - & 1.0_DFP,1.0_DFP,1.0_DFP,1.0_DFP], [2,4]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) -CALL GetInterpolation(obj=obj, interpol=var2, val=var1) -CALL Display( var2, "Vector + space") -CALL Display( Interpolation(obj, var1), "Vector + space") -``` - -!!! settings "Cleanup" - -```fortran - CALL DEALLOCATE( obj ) - CALL DEALLOCATE( var1 ) - CALL DEALLOCATE( var2 ) -END PROGRAM space -``` diff --git a/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_1.F90 b/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_1.F90 new file mode 100644 index 00000000..06b24caf --- /dev/null +++ b/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_1.F90 @@ -0,0 +1,91 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-08-30 +! summary: Example to use `GetInterpolation` method for scalar variable. + +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE BaseType, ONLY: ElemshapeData_, QuadraturePoint_, ReferenceQuadrangle_, & + FEVariable_, TypeH1, TypeLagrangeInterpolation, & + TypeQuadratureOpt, TypePolynomialOpt, & + TypeFEVariableScalar, TypeFEVariableConstant, & + TypeFEVariableSpace + +USE ReferenceQuadrangle_Method +USE QuadraturePoint_Method +USE ElemShapeData_Method +USE FEVariable_Method +USE OnesUtility +USE Display_Method + +IMPLICIT NONE + +TYPE(ElemShapeData_) :: obj +TYPE(QuadraturePoint_) :: quad +TYPE(ReferenceQuadrangle_) :: refelem +TYPE(FEVariable_) :: fevar +INTEGER(I4B) :: ipType, basisType +REAL(DFP), ALLOCATABLE :: interpol(:) +INTEGER(I4B), PARAMETER :: nsd = 2, order = 2 +REAL(DFP), PARAMETER :: xij(2, 4) = RESHAPE([-1.0, -1.0, 1.0, -1.0, & + 1.0, 1.0, -1.0, 1.0], & + [2, 4]) + +! Initiate an instance of [[ReferenceQuadrangle_]] +refelem = ReferenceQuadrangle(nsd=nsd) + +! Initiate Gauss-Legendre Quadrature points. +CALL Initiate(obj=quad, refelem=refelem, order=order, & + quadratureType='GaussLegendre') + +ipType = TypeQuadratureOpt%equidistance +basisType = TypePolynomialOpt%monomial + +! Initiate an instance of [[ElemshapeData_]] for [[ReferenceQuadrangle_]]. +! The code shown below ONLY initiates the local shape FUNCTION DATA. + +CALL Initiate(obj=obj, quad=quad, refelem=refelem, & + baseContinuity=TypeH1, & + baseInterpolation=TypeLagrangeInterpolation, & + ipType=ipType, basisType=basisType, order=order) + +CALL Set(obj=obj, val=xij(1:nsd, 1:obj%nns), & + N=obj%N(1:obj%nns, 1:obj%nips), & + dNdXi=obj%dNdXi(1:obj%nns, 1:obj%xidim, 1:obj%nips)) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +SUBROUTINE test1 + ! Scalar, constant. + fevar = NodalVariable(1.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + CALL GetInterpolation(obj=obj, ans=interpol, val=fevar) + CALL Display(interpol, "scalar+constant: ") +END SUBROUTINE test1 + +SUBROUTINE test2 +! Scalar constant +! fevar = NodalVariable(1.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) +! CALL Display(Interpolation(obj=obj, val=fevar), "scalar+constant:") +END SUBROUTINE test2 + +SUBROUTINE test3 + ! Scalar, space. + fevar = NodalVariable(ones(4, 1.0_DFP), TypeFEVariableScalar, & + TypeFEVariableSpace) + CALL GetInterpolation(obj=obj, ans=interpol, val=fevar) + CALL Display(interpol, "scalar+space: ") +END SUBROUTINE test3 + +SUBROUTINE test4 +! Scalar, space +! var1 = NodalVariable(ones(4, 1.0_DFP), & +! typeFEVariableScalar, & +! typeFEVariableSpace) +! CALL Display(Interpolation(obj=obj, val=var1), "scalar+space") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_1.md b/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_1.md new file mode 100644 index 00000000..7d5bd2ba --- /dev/null +++ b/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_1.md @@ -0,0 +1,7 @@ +Example to use `GetInterpolation` method for scalar variable. + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetInterpolation_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_2.F90 b/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_2.F90 new file mode 100644 index 00000000..dda29862 --- /dev/null +++ b/docs/docs-api/ElemshapeData/examples/_GetInterpolation_test_2.F90 @@ -0,0 +1,120 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-08-30 +! summary: Example to use `GetInterpolation` method for vector variable. + +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE BaseType, ONLY: ElemshapeData_, QuadraturePoint_, ReferenceQuadrangle_, & + FEVariable_, TypeH1, TypeLagrangeInterpolation, & + TypeQuadratureOpt, TypePolynomialOpt, & + TypeFEVariableVector, TypeFEVariableConstant, & + TypeFEVariableSpace + +USE ReferenceQuadrangle_Method +USE QuadraturePoint_Method +USE ElemShapeData_Method +USE FEVariable_Method +USE OnesUtility +USE Display_Method + +IMPLICIT NONE + +TYPE(ElemShapeData_) :: obj +TYPE(QuadraturePoint_) :: quad +TYPE(ReferenceQuadrangle_) :: refelem +TYPE(FEVariable_) :: fevar +INTEGER(I4B) :: ipType, basisType +REAL(DFP), ALLOCATABLE :: interpol(:, :) +INTEGER(I4B), PARAMETER :: nsd = 2, order = 2 +REAL(DFP), PARAMETER :: xij(2, 4) = RESHAPE([-1.0, -1.0, 1.0, -1.0, & + 1.0, 1.0, -1.0, 1.0], & + [2, 4]) + +! Initiate an instance of [[ReferenceQuadrangle_]] +refelem = ReferenceQuadrangle(nsd=nsd) + +! Initiate Gauss-Legendre Quadrature points. +CALL Initiate(obj=quad, refelem=refelem, order=order, & + quadratureType='GaussLegendre') + +ipType = TypeQuadratureOpt%equidistance +basisType = TypePolynomialOpt%monomial + +! Initiate an instance of [[ElemshapeData_]] for [[ReferenceQuadrangle_]]. +! The code shown below ONLY initiates the local shape FUNCTION DATA. + +CALL Initiate(obj=obj, quad=quad, refelem=refelem, & + baseContinuity=TypeH1, & + baseInterpolation=TypeLagrangeInterpolation, & + ipType=ipType, basisType=basisType, order=order) + +CALL Set(obj=obj, val=xij(1:nsd, 1:obj%nns), & + N=obj%N(1:obj%nns, 1:obj%nips), & + dNdXi=obj%dNdXi(1:obj%nns, 1:obj%xidim, 1:obj%nips)) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +! Vector Constant NodalVariable GetInterpolation +SUBROUTINE test1 + REAL(DFP) :: nodeVal(3) + nodeVal = [1.0_DFP, 2.0_DFP, 3.0_DFP] + fevar = NodalVariable(nodeVal, TypeFEVariableVector, TypeFEVariableConstant) + CALL GetInterpolation(obj=obj, ans=interpol, val=fevar) + CALL Display(interpol, "vector + constant: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +! Vector Constant NodalVariable Interpolation +SUBROUTINE test2 +! Scalar constant +! fevar = NodalVariable(1.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) +! CALL Display(Interpolation(obj=obj, val=fevar), "scalar+constant:") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +! Vector Space NodalVariable GetInterpolation +SUBROUTINE test3 + REAL(DFP) :: nodeVal(3, 4) + + nodeVal = RESHAPE([1.0_DFP, 1.0_DFP, 1.0_DFP, & + 2.0_DFP, 2.0_DFP, 2.0_DFP, & + 3.0_DFP, 3.0_DFP, 3.0_DFP, & + 4.0_DFP, 4.0_DFP, 4.0_DFP], & + [3, 4]) + + fevar = NodalVariable(nodeVal, TypeFEVariableVector, & + TypeFEVariableSpace) + + CALL GetInterpolation(obj=obj, ans=interpol, val=fevar) + CALL Display(interpol, "vector + space: ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +! Vector Space NodalVariable Interpolation +SUBROUTINE test4 +! Scalar, space +! var1 = NodalVariable(ones(4, 1.0_DFP), & +! typeFEVariableScalar, & +! typeFEVariableSpace) +! CALL Display(Interpolation(obj=obj, val=var1), "scalar+space") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/ElemshapeData/examples/_Initiate_test_1.F90 b/docs/docs-api/ElemshapeData/examples/_Initiate_test_1.F90 new file mode 100644 index 00000000..6be6ed43 --- /dev/null +++ b/docs/docs-api/ElemshapeData/examples/_Initiate_test_1.F90 @@ -0,0 +1,43 @@ +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE BaseType, ONLY: ElemShapeData_, QuadraturePoint_, ReferenceLine_, & + TypePolynomialOpt, TypeQuadratureOpt, TypeH1, & + TypeLagrangeInterpolation +USE ReferenceElement_Method +USE ReferenceLine_Method +USE QuadraturePoint_Method +USE ElemShapeData_Method +USE Display_Method +USE String_Class + +IMPLICIT NONE + +TYPE(ElemShapeData_) :: elemsd +TYPE(QuadraturePoint_) :: quad +TYPE(ReferenceLine_) :: refelem +INTEGER(I4B) :: quadratureType, ipType, basisType, order + +refelem = ReferenceLine(nsd=1_I4B) + +order = 4_I4B +quadratureType = TypeQuadratureOpt%gaussLegendre + +CALL Initiate(obj=quad, refElem=refElem, order=order, & + quadratureType=quadratureType) + +order = 1 +ipType = TypeQuadratureOpt%equidistance +basisType = TypePolynomialOpt%monomial + +CALL Initiate(obj=elemsd, quad=quad, refelem=refelem, & + baseContinuity=TypeH1, & + baseInterpolation=TypeLagrangeInterpolation, & + ipType=ipType, basisType=basisType, order=order) + +! CALL Display(elemsd%N, "elemsd: ") +! CALL Display(elemsd%dNdXi, "elemsd: ") + +CALL Display(ElemShapeData_MdEncode(elemsd), "") + +END PROGRAM main + diff --git a/docs/docs-api/ElemshapeData/examples/_Initiate_test_1a.md b/docs/docs-api/ElemshapeData/examples/_Initiate_test_1.md similarity index 80% rename from docs/docs-api/ElemshapeData/examples/_Initiate_test_1a.md rename to docs/docs-api/ElemshapeData/examples/_Initiate_test_1.md index 3e6a8dfd..bd36c6b7 100644 --- a/docs/docs-api/ElemshapeData/examples/_Initiate_test_1a.md +++ b/docs/docs-api/ElemshapeData/examples/_Initiate_test_1.md @@ -1,45 +1,10 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE - -TYPE(ElemShapeData_) :: elemsd -TYPE(QuadraturePoint_) :: quad -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: quadratureType, ipType, basisType, order - -refelem = ReferenceLine(nsd=1_I4B) - -order = 4_I4B -quadratureType = GaussLegendre - -CALL Initiate( & - & obj=quad, & - & refElem=refElem, & - & order=order, & - & quadratureType=quadratureType) - -order = 1 -ipType = Equidistance -basisType = Monomial - -CALL Initiate( & - & obj=elemsd, & - & quad=quad, & - & refelem=refelem, & - & baseContinuity=TypeH1, & - & baseInterpolation=TypeLagrangeInterpolation, & - & ipType=ipType, & - & basisType=basisType, & - & order=order) - -! CALL Display(elemsd%N, "elemsd: ") -! CALL Display(elemsd%dNdXi, "elemsd: ") - -CALL Display(ElemshapeData_MdEncode(elemsd), "") - -END PROGRAM main -``` +This example tests the Initiate method for constructing ElemShapeData. + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_1.F90'; + +{CodeSnippet}
See results diff --git a/docs/docs-api/ElemshapeData/examples/runner.toml b/docs/docs-api/ElemshapeData/examples/runner.toml index ab1b7763..042cd919 100644 --- a/docs/docs-api/ElemshapeData/examples/runner.toml +++ b/docs/docs-api/ElemshapeData/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/elemshapedata/" +BuildDir = "/tmp/easifem-tests/ElemShapeData" TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/FEDOF/Copy.md b/docs/docs-api/FEDOF/Copy.md new file mode 100644 index 00000000..1613be19 --- /dev/null +++ b/docs/docs-api/FEDOF/Copy.md @@ -0,0 +1,67 @@ +# Copy + +The `Copy` method copies the contents of one `FEDOF_` object to another. This method is also used by the assignment operator (`=`) for `FEDOF_` objects. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE Copy(obj, obj2) + CLASS(FEDOF_), INTENT(INOUT) :: obj + CLASS(FEDOF_), INTENT(IN) :: obj2 + END SUBROUTINE Copy +END INTERFACE +``` + +## Parameters + +- `obj` - The destination `FEDOF_` object that will receive the copied data +- `obj2` - The source `FEDOF_` object whose data will be copied + +## Implementation Details + +The method performs a shallow copy of most attributes from `obj2` to `obj`: + +1. Copies basic properties: + - `isLagrange` - Flag indicating if the base interpolation is Lagrange + - `tdof` - Total number of degrees of freedom + - `tNodes`, `tEdges`, `tFaces`, `tCells` - Total count of different mesh entities + - `baseContinuity` - Continuity or conformity of basis (e.g., "H1") + - `baseInterpolation` - Type of basis functions (e.g., "LAGR", "HIER") + - `maxCellOrder`, `maxFaceOrder`, `maxEdgeOrder` - Maximum order values + +2. Sets the mesh pointer to point to the same mesh as the source object: + +```fortran +obj%mesh => obj2%mesh +``` + +3. Copies array data when allocated in the source object: + - `cellOrder` - Order of each cell + - `faceOrder` - Order of each face + - `edgeOrder` - Order of each edge + - `edgeIA`, `faceIA`, `cellIA` - Sparsity patterns for different entities + +4. Associates finite element pointers: + +```fortran +DO ii = 1, SIZE(obj2%fe) + isok = ASSOCIATED(obj2%fe(ii)%ptr) + IF (isok) THEN + obj%fe(ii)%ptr => obj2%fe(ii)%ptr + END IF +END DO +``` + +## Notes + +- This is a shallow copy - the mesh and finite element pointers in the destination object point to the same objects as the source. +- Array data is copied only if it exists in the source object. +- The method doesn't allocate new memory for arrays; it assumes the destination arrays either don't exist or are already properly allocated. +- This method is particularly useful when you need to create a duplicate of a `FEDOF_` object without creating new underlying mesh or finite element instances. + +## Example + +import EXAMPLE65 from "./examples/_Copy_test_1.md"; + + diff --git a/docs/docs-api/FEDOF/Deallocate.md b/docs/docs-api/FEDOF/Deallocate.md new file mode 100644 index 00000000..d7437a09 --- /dev/null +++ b/docs/docs-api/FEDOF/Deallocate.md @@ -0,0 +1,41 @@ +# Deallocate + +The `Deallocate` method releases all allocated memory and nullifies pointers in a `FEDOF_` object, returning it to an uninitialized state. This method is essential for proper memory management to prevent memory leaks. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE DEALLOCATE (obj) + CLASS(FEDOF_), INTENT(INOUT) :: obj + END SUBROUTINE DEALLOCATE +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object to be deallocated + +## Notes + +- This method checks if arrays are allocated before attempting to deallocate them, preventing potential runtime errors. +- For each associated finite element pointer, it calls the `DEALLOCATE` method of the finite element object before nullifying the pointer. +- The method does not deallocate the mesh itself, as the `FEDOF_` object only maintains a pointer to the mesh, which might be used elsewhere. +- After calling this method, the `FEDOF_` object is reset to its default state and can be reused for a new initialization. + +## Example Usage + +```fortran +TYPE(FEDOF_) :: dof + +! After using dof... +CALL dof%DEALLOCATE() + +! Now dof can be reused or safely go out of scope +``` + +## Important Considerations + +- This method should be called when the `FEDOF_` object is no longer needed to prevent memory leaks. +- It's particularly important to call this method before reinitializing an existing `FEDOF_` object to avoid memory leaks. +- The method only deallocates resources directly owned by the `FEDOF_` object; it does not deallocate the mesh or other external resources that might be referenced by pointers. diff --git a/docs/docs-api/FEDOF/GetBaseInterpolation.md b/docs/docs-api/FEDOF/GetBaseInterpolation.md new file mode 100644 index 00000000..7cf9bab1 --- /dev/null +++ b/docs/docs-api/FEDOF/GetBaseInterpolation.md @@ -0,0 +1,80 @@ +# GetBaseInterpolation + +The `GetBaseInterpolation` method returns the type of basis functions used for interpolation on the reference element in the FEDOF (Finite Element Degrees of Freedom) instance. + +## Interface + +The specific interface is defined as: + +```fortran +MODULE FUNCTION obj_GetBaseInterpolation(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CHARACTER(:), ALLOCATABLE :: ans +END FUNCTION obj_GetBaseInterpolation +``` + +## Description + +The `GetBaseInterpolation` method returns the type of basis functions used for interpolation on the reference element in the FEDOF (Finite Element Degrees of Freedom) instance. This information is crucial for understanding how the finite element approximation is constructed. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `CHARACTER(:), ALLOCATABLE`, string containing the base interpolation type + +### Implementation Details + +The implementation is straightforward, returning the internal `baseInterpolation` property: + +```fortran +MODULE PROCEDURE obj_GetBaseInterpolation +ans = obj%baseInterpolation +END PROCEDURE obj_GetBaseInterpolation +``` + +### Possible Return Values + +The method returns one of the following interpolation types: + +- `"LAGR"` - Lagrange interpolation +- `"HIER"` - Hierarchical interpolation +- `"ORTHO"` - Orthogonal interpolation +- `"HERM"` - Hermite interpolation +- `"SERE"` - Serendipity interpolation + +## Usage Example + +```fortran +! Example to get the base interpolation type +CHARACTER(:), ALLOCATABLE :: interpType +TYPE(FEDOF_) :: myDOF + +! Get the interpolation type +interpType = myDOF%GetBaseInterpolation() + +! Check interpolation type and take appropriate action +SELECT CASE (interpType) +CASE ("LAGR") + PRINT *, "Using Lagrange interpolation" +CASE ("HIER") + PRINT *, "Using Hierarchical interpolation" +CASE DEFAULT + PRINT *, "Using other interpolation type: ", interpType +END SELECT +``` + +## Important Notes + +1. The base interpolation type works in conjunction with the base continuity (e.g., "H1", "HCurl", "HDiv", "DG") to determine the complete function space used. +2. The `GetCaseName` method combines the base continuity and base interpolation into a single identifier (e.g., "H1LAGR"). +3. Different interpolation types have different mathematical properties and are suitable for different types of problems. + +## Related Methods + +- `GetCaseName` - Returns the combined continuity and interpolation identifier +- `GetLocalElemShapeData` - Uses the interpolation type to determine which shape functions to compute +- `GetLocalElemShapeDataH1Lagrange` - Specialized method for Lagrange interpolation +- `GetLocalElemShapeDataH1Hierarchical` - Specialized method for Hierarchical interpolation + +The `GetBaseInterpolation` method is important for understanding the mathematical basis of the finite element approximation and is often used to determine which specialized algorithms should be applied for shape function evaluation and element matrix assembly. + diff --git a/docs/docs-api/FEDOF/GetCaseName.md b/docs/docs-api/FEDOF/GetCaseName.md new file mode 100644 index 00000000..a092d456 --- /dev/null +++ b/docs/docs-api/FEDOF/GetCaseName.md @@ -0,0 +1,81 @@ +# GetCaseName + +The `GetCaseName` method returns a string that identifies the combination of continuity and interpolation type used in the finite element degree of freedom object. This case name is used internally to determine which algorithms to apply when processing the finite element data. + +## Interface + +```fortran +INTERFACE + MODULE FUNCTION GetCaseName(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CHARACTER(6) :: ans + END FUNCTION GetCaseName +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object from which to obtain the case name + +## Return Value + +- `ans` - A 6-character string combining the basis continuity and the interpolation type + +## Implementation Details + +The method is straightforward, concatenating the `baseContinuity` and `baseInterpolation` properties of the `FEDOF_` object: + +```fortran +ans = obj%baseContinuity//obj%baseInterpolation +``` + +## Possible Return Values + +The return value is a combination of the continuity type and interpolation type: + +1. For continuity (`obj%baseContinuity`): + - `"H1"` - Standard $H^{1}$ conforming elements + - `"HC[url]"` - H(curl) conforming elements + - `"HD[iv]"` - H(div) conforming elements + - `"DG"` - Discontinuous Galerkin elements + +2. For interpolation (`obj%baseInterpolation`): + - `"LAGR"` - Lagrange interpolation + - `"HIER"` - Hierarchical interpolation + - `"ORTHO"` - Orthogonal interpolation + - `"HERM"` - Hermite interpolation + - `"SERE"` - Serendipity interpolation + +Common combinations include: + +- `"H1LAGR"` - H¹ conforming elements with Lagrange interpolation +- `"H1HIER"` - H¹ conforming elements with hierarchical interpolation +- `"DGHIER"` - Discontinuous Galerkin with hierarchical interpolation + +## Usage Examples + +The case name is primarily used in conditional branching to select the appropriate algorithms for a given finite element type: + +```fortran +CHARACTER(6) :: casename +casename = fedof%GetCaseName() + +SELECT CASE (casename) +CASE ('H1LAGR') + ! Process H¹ conforming elements with Lagrange interpolation +CASE ('H1HIER') + ! Process H¹ conforming elements with hierarchical interpolation +CASE ('DGHIER') + ! Process Discontinuous Galerkin with hierarchical interpolation +CASE DEFAULT + ! Handle unexpected case +END SELECT +``` + +This method is used extensively within the `FEDOF_` class to determine the appropriate algorithms for shape function calculation, connectivity generation, and other operations that depend on the specific type of finite element formulation. + +## Example + +import EXAMPLE80 from "./examples/_GetCaseName_test_1.md"; + + diff --git a/docs/docs-api/FEDOF/GetCellDOF.md b/docs/docs-api/FEDOF/GetCellDOF.md new file mode 100644 index 00000000..6ceb04e0 --- /dev/null +++ b/docs/docs-api/FEDOF/GetCellDOF.md @@ -0,0 +1,57 @@ +# GetCellDOF + +Get the degrees of freedom associated with a specific cell (element volume) in the finite element mesh. + +## Interface + +```fortran +MODULE SUBROUTINE GetCellDOF(obj, globalCell, ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalCell + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal +END SUBROUTINE GetCellDOF +``` + +## Parameters + +- `obj`: The FEDOF_ object +- `globalCell`: Global cell number to retrieve DOFs for +- `ans`: Integer array to store the retrieved DOFs +- `tsize`: Output parameter containing the total size of data written in ans +- `islocal`: Optional logical flag - if true, globalCell is treated as a local cell number + +## Functionality + +This method retrieves all degrees of freedom associated with a specific cell (element volume) identified by its global cell number. It performs the following operations: + +1. Converts the global cell number to a local cell number if needed +2. Accesses the cell DOF information using the cell index array (`cellIA`) +3. Populates the `ans` array with the DOF indices for the specified cell +4. Sets `tsize` to the number of DOFs associated with the cell + +The implementation leverages the cell sparsity pattern stored in the `cellIA` array, which provides the start and end indices for each cell's DOF information. + +## Implementation Details + +The method first converts the global cell number to a local cell number using the mesh's `GetLocalElemNumber` method. It then iterates through the DOF indices stored for this cell, copying each one into the `ans` array and incrementing the `tsize` counter. + +## Usage + +The `GetCellDOF` method is important for finite element implementations where you need to: + +- Assemble matrices based on cell (volume) contributions +- Apply internal conditions on specific cells +- Compute cell-based integrals or other operations +- Access all degrees of freedom associated with a cell for post-processing + +Unlike vertex, edge, or face DOFs which are typically shared between elements, cell DOFs are internal to a specific element, making them important for capturing high-order behavior within elements. + +## Example 1 + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./examples/_GetCellDOF_test_1.md'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/GetCellOrder.md b/docs/docs-api/FEDOF/GetCellOrder.md new file mode 100644 index 00000000..a5b0fa46 --- /dev/null +++ b/docs/docs-api/FEDOF/GetCellOrder.md @@ -0,0 +1,82 @@ +# GetCellOrder + +The `GetCellOrder` method retrieves the polynomial order of a specified cell element. + +## Interface + +```fortran +MODULE SUBROUTINE obj_GetCellOrder(obj, cellOrder, tCellOrder, globalElement, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + !! fedof object + INTEGER(I4B), INTENT(INOUT) :: cellOrder(:) + !! cell order + INTEGER(I4B), INTENT(OUT) :: tCellOrder + !! size of data written in cellOrder + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local element number + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then globalElement is local element +END SUBROUTINE obj_GetCellOrder +``` + +## Description + +The `GetCellOrder` method retrieves the polynomial order of a specified cell element. The polynomial order determines the degree of the basis functions used for approximation within that element, which directly impacts the accuracy and computational cost of the finite element solution. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `cellOrder` - Output, `INTEGER(I4B)(:)`, pre-allocated array to store the cell order +- `tCellOrder` - Output, `INTEGER(I4B)`, total size of data written to the `cellOrder` array (typically 1) +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +The implementation converts the global element number to a local element number if needed, then retrieves the cell order from the internal storage: + +```fortran +INTEGER(I4B) :: jj + +jj = obj%mesh%GetLocalElemNumber(globalElement=globalElement, islocal=islocal) + +cellOrder(1) = obj%cellOrder(jj) +tcellOrder = 1 +``` + +## Usage Example + +```fortran +! Example to get the order of a cell +INTEGER(I4B) :: order(1), tOrder +TYPE(FEDOF_) :: myDOF + +! Get order for element #5 +CALL myDOF%GetCellOrder(cellOrder=order, tCellOrder=tOrder, globalElement=5) +PRINT *, "Element 5 has order:", order(1) + +! Get order for element #3 using local numbering +CALL myDOF%GetCellOrder(cellOrder=order, tCellOrder=tOrder, globalElement=3, islocal=.TRUE.) +PRINT *, "Local element 3 has order:", order(1) +``` + +## Important Notes + +1. The `cellOrder` array typically only needs one element as this method returns a single value +2. The `tCellOrder` return value will typically be 1, indicating a single value written to `cellOrder` +3. In p-adaptive finite element methods, different cells may have different polynomial orders + +## Related Methods + +- `GetOrders` - More comprehensive method that returns cell, face, and edge orders along with their orientations +- `SetCellOrder` - Sets the polynomial order for cells +- `GetLocalElemShapeData` - Uses the cell order to determine the appropriate shape functions +- `GetQuadraturePoints` - Often needs the cell order to determine appropriate quadrature rules + +The `GetCellOrder` method is important for finite element implementations that use p-adaptive methods or variable-order elements, where the polynomial degree may vary between elements to optimize computational efficiency. + +## Example + +import EXAMPLE81 from "./examples/_GetCellOrder_test_1.md"; + + diff --git a/docs/docs-api/FEDOF/GetConnectivity.md b/docs/docs-api/FEDOF/GetConnectivity.md new file mode 100644 index 00000000..65d97e22 --- /dev/null +++ b/docs/docs-api/FEDOF/GetConnectivity.md @@ -0,0 +1,70 @@ +# GetConnectivity + +The `GetConnectivity` method returns the global degrees of freedom (DOFs) associated with a specified element in the mesh. This connectivity information is essential for assembling local element matrices and vectors into the global system during finite element analysis. + +## Interface + +```fortran +INTERFACE + MODULE FUNCTION GetConnectivity(obj, opt, globalElement, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(INOUT) :: obj + CHARACTER(*), INTENT(IN) :: opt + INTEGER(I4B), INTENT(IN) :: globalElement + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + INTEGER(I4B), ALLOCATABLE :: ans(:) + END FUNCTION GetConnectivity +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object containing degree of freedom information +- `opt` - A string specifying which type of connectivity to retrieve: + - `"Vertex"` - Only vertex DOFs + - `"Edge"` - Only edge DOFs + - `"Face"` - Only face DOFs + - `"Cell"` - Only cell DOFs + - `"All"` - All DOFs (vertices, edges, faces, and cells) +- `globalElement` - The global or local element number, depending on the value of `islocal` +- `islocal` - Optional logical flag. If present and `.TRUE.`, `globalElement` is interpreted as a local element number; otherwise, it's a global element number + +## Return Value + +- `ans` - An allocatable array containing the global DOF numbers associated with the specified element, filtered according to the `opt` parameter + +## Implementation Details + +The function: + +1. Determines the total number of DOFs for the element using `obj%GetTotalDOF` +2. Allocates the return array with the appropriate size +3. Calls the `obj%GetConnectivity_` subroutine to populate the array with the actual connectivity data + +The key steps in the implementation are: + +```fortran +tdof = obj%GetTotalDOF(globalElement=globalElement, isLocal=isLocal) +ALLOCATE (ans(tdof)) +CALL obj%GetConnectivity_(ans=ans, tsize=tdof, opt=opt, +globalElement = globalElement, islocal = islocal) +``` + +The underlying `GetConnectivity_` subroutine performs the actual work of gathering the connectivity data by: + +1. Getting the element's topological entities (vertices, edges, faces, and cells) +2. Retrieving the DOFs for each entity using the appropriate methods (`GetVertexDOF`, `GetEdgeDOF`, etc.) +3. Combining these DOFs into a single connectivity array + +## Notes + +- For Lagrangian elements (`obj%isLagrange` is `.TRUE.`), only vertex DOFs are considered, regardless of the `opt` parameter +- For hierarchical elements, the connectivity includes all specified entity types (vertices, edges, faces, cells) +- The connectivity array contains global DOF numbers that map the local element DOFs to the global system +- The order of DOFs in the returned array follows a hierarchical pattern: vertices first, then edges, faces, and finally cell DOFs +- This method is crucial for element assembly operations in finite element analysis + +## Example + +import EXAMPLE68 from "./examples/_GetConnectivity_test_1.md"; + + diff --git a/docs/docs-api/FEDOF/GetConnectivity_.md b/docs/docs-api/FEDOF/GetConnectivity_.md new file mode 100644 index 00000000..8e57dd14 --- /dev/null +++ b/docs/docs-api/FEDOF/GetConnectivity_.md @@ -0,0 +1,94 @@ +# GetConnectivity_ + +## Interface + +```fortran +MODULE SUBROUTINE obj_GetConnectivity_(obj, ans, tsize, opt, globalElement, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! FEDOF object + INTEGER(I4B), INTENT(INOUT) :: ans(:) + !! connectivity of element + INTEGER(I4B), INTENT(OUT) :: tsize + !! total size of data written in con + CHARACTER(*), INTENT(IN) :: opt + !! opt = Vertex + !! opt = Edge + !! opt = Face + !! opt = Cell + !! opt = All + INTEGER(I4B), INTENT(IN) :: globalElement + !! Global element number + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if islocal true then globalElement is local element number +END SUBROUTINE obj_GetConnectivity_ +``` + +## Description + +The `GetConnectivity_` method retrieves the connectivity (degrees of freedom) of a specified element and writes it into a provided array. This method allows for filtering the types of entities (vertices, edges, faces, cells) to include in the connectivity. + +### Parameters + +- `obj` - Input/Output, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `INTEGER(I4B)(:)`, pre-allocated array to store the connectivity information +- `tsize` - Output, `INTEGER(I4B)`, total size of data written to the `ans` array +- `opt` - Input, `CHARACTER(*)`, option specifying which entities to include: + - `"Vertex"` - Include only vertex DOFs + - `"Edge"` - Include only edge DOFs + - `"Face"` - Include only face DOFs + - `"Cell"` - Include only cell DOFs + - `"All"` - Include all DOFs (default) +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +The implementation follows these steps: + +1. Converts the global element number to a local element number if needed +2. Gets the total entities (vertices, edges, faces, cells) for the element +3. Retrieves the connectivity from the mesh for the specified element +4. Processes each entity type (vertices, edges, faces, cells) and adds their DOFs to the `ans` array +5. Updates `tsize` with the total number of DOFs added + +```fortran +localElement = obj%mesh%GetLocalElemNumber(globalElement=globalElement, islocal=islocal) +ent = obj%mesh%GetTotalEntities(globalElement=localElement, islocal=yes) +CALL obj%mesh%GetConnectivity_(globalElement=localElement, islocal=yes, opt=opt, tsize=jj, ans=temp) + +! Process vertices, edges, faces, and cells... +! For each entity, call the appropriate GetXXXDOF method and add to ans array + +tsize = jj - 1 +``` + +## Usage Example + +```fortran +! Example to get connectivity for an element +INTEGER(I4B) :: conn(100), totalSize +TYPE(FEDOF_) :: myDOF + +! Get all DOFs for element #5 +CALL myDOF%GetConnectivity_(ans=conn, tsize=totalSize, opt="All", globalElement=5) + +! Get only vertex DOFs for element #8 +CALL myDOF%GetConnectivity_(ans=conn, tsize=totalSize, opt="Vertex", globalElement=8) + +! Get only edge DOFs for element #3, using local numbering +CALL myDOF%GetConnectivity_(ans=conn, tsize=totalSize, opt="Edge", globalElement=3, islocal=.TRUE.) +``` + +## Important Notes + +1. The `ans` array must be pre-allocated with sufficient size to hold all the requested DOFs +2. The `tsize` return value indicates how many values were actually written to `ans` +3. This method is often used internally by the functional variant `GetConnectivity` + +## Related Methods + +- `GetConnectivity` - Function version that allocates and returns the connectivity array +- `GetVertexDOF`, `GetEdgeDOF`, `GetFaceDOF`, `GetCellDOF` - Methods for retrieving specific entity DOFs +- `GetTotalDOF` - Used to determine the required size for connectivity arrays + +The `GetConnectivity_` method provides a lower-level interface for retrieving connectivity information, offering more control over memory allocation compared to the functional `GetConnectivity` method. diff --git a/docs/docs-api/FEDOF/GetEdgeDOF.md b/docs/docs-api/FEDOF/GetEdgeDOF.md new file mode 100644 index 00000000..2ab745c4 --- /dev/null +++ b/docs/docs-api/FEDOF/GetEdgeDOF.md @@ -0,0 +1,76 @@ +# GetEdgeDOF + +The `GetEdgeDOF` is a generic method in the `FEDOF_` class that retrieves degrees of freedom associated with edges. It has two specific implementations: + +| Method | Description | +| ----------- | -------------------------------------------------------------------------------- | +| GetEdgeDOF1 | Gets edge degrees of freedom using the global edge number | +| GetEdgeDOF2 | Gets edge degrees of freedom using a global element number and local edge number | + +## Interface 1 + +```fortran +MODULE SUBROUTINE GetEdgeDOF(obj, globalEdge, ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalEdge + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal +END SUBROUTINE GetEdgeDOF +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalEdge`: Global edge number to retrieve DOFs for +- `ans`: Integer array to store the retrieved DOFs +- `tsize`: Output parameter containing the total size of data written in ans +- `islocal`: Optional logical flag - if true, globalEdge is treated as a local edge number + +### Functionality + +This method retrieves all degrees of freedom associated with a specific edge identified by its global edge number. It looks up the edge DOFs in the `edgeIA` array which contains the sparsity pattern for edges. + +## Interface 2 + +```fortran +MODULE SUBROUTINE GetEdgeDOF2(obj, globalElement, localEdgeNumber, & + ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local cell element number + INTEGER(I4B), INTENT(IN) :: localEdgeNumber + !! local edge number in global element + INTEGER(I4B), INTENT(INOUT) :: ans(:) + !! edge degree of freedom + INTEGER(I4B), INTENT(OUT) :: tsize + !! tota size of data written in ans + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + !! if true then globalElement is local element +END SUBROUTINE GetEdgeDOF2 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalElement`: Global element number containing the edge +- `localEdgeNumber`: Local edge number within the element +- `ans`: Integer array to store the retrieved DOFs +- `tsize`: Output parameter containing the total size of data written in ans +- `islocal`: Optional logical flag - if true, globalElement is treated as a local element number + +### Functionality + +This method first converts the element and local edge information to a global edge number, then calls `GetEdgeDOF` to retrieve the DOFs. It uses the mesh information to determine the global edge number from the element and local edge number. + +## Usage + +This method is important for finite element implementations where you need to: + +- Assemble matrices based on edge contributions +- Apply boundary conditions on specific edges +- Compute edge-based integrals or other operations + +The generic interface allows users to retrieve edge DOFs either by directly specifying the global edge number or by specifying an element and the local edge number within that element, providing flexibility in how edge data is accessed. + +## Example diff --git a/docs/docs-api/FEDOF/GetFaceDOF.md b/docs/docs-api/FEDOF/GetFaceDOF.md new file mode 100644 index 00000000..20d13ffd --- /dev/null +++ b/docs/docs-api/FEDOF/GetFaceDOF.md @@ -0,0 +1,95 @@ +# GetFaceDOF + +The `GetFaceDOF` generic method in the `FEDOF_Class` is used to retrieve the degrees of freedom (DOF) associated with a face in a finite element mesh. This method has two specific implementations with different parameter sets. + +## Method Description + +The `GetFaceDOF` generic method retrieves face degrees of freedom through two different interfaces: + +1. `GetFaceDOF1` - Gets DOFs directly using a global face number +2. `GetFaceDOF2` - Gets DOFs using a global element number and local face number within that element + +## Interface 1 + +```fortran +SUBROUTINE obj_GetFaceDOF1(obj, globalFace, ans, tsize, islocal) +``` + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalFace` - Input, `INTEGER(I4B)`, global face number +- `ans` - Output, `INTEGER(I4B)(:)`, array to store face degrees of freedom +- `tsize` - Output, `INTEGER(I4B)`, total size of data written to `ans` +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalFace` is treated as a local face number + +### Implementation Details + +The implementation in `GetMethods` submodule uses the internal face index array structure: + +```fortran +INTEGER(I4B) :: ii +tsize = 0 +DO ii = obj%faceIA(globalface), obj%faceIA(globalface + 1) - 1 + tsize = tsize + 1 + ans(tsize) = ii +END DO +``` + +The method retrieves DOFs from the face sparsity data structure using the compressed sparse row format stored in `faceIA`. + +## Interface 2 + +```fortran +SUBROUTINE obj_GetFaceDOF2(obj, globalElement, localFaceNumber, ans, tsize, islocal) +``` + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, DOF object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `localFaceNumber` - Input, `INTEGER(I4B)`, local face number in global element +- `ans` - Output, `INTEGER(I4B)(:)`, array to store face degrees of freedom +- `tsize` - Output, `INTEGER(I4B)`, total size of data written to `ans` +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +This implementation first converts the element and local face information to a global face number, then calls the first implementation: + +```fortran +INTEGER(I4B) :: globalFace +globalFace = obj%mesh%GetGlobalFaceNumber(globalElement=globalElement, & + islocal=islocal, localFaceNumber=localFaceNumber) +CALL obj%GetFaceDOF(globalFace=globalFace, ans=ans, tsize=tsize, & + islocal=islocal) +``` + +## Usage Example + +```fortran +! Example to get DOFs from a face +INTEGER(I4B) :: faceDOFs(100), totalDOFs +TYPE(FEDOF_) :: myDOF + +! Method 1: Using global face number +CALL myDOF%GetFaceDOF(globalFace=5, ans=faceDOFs, tsize=totalDOFs) + +! Method 2: Using element and local face number +CALL myDOF%GetFaceDOF(globalElement=10, localFaceNumber=2, ans=faceDOFs, tsize=totalDOFs) +``` + +## Related Methods + +- `GetTotalFaceDOF` - Returns the total number of DOFs on a face +- `GetEdgeDOF` - Similar function but for element edges +- `GetCellDOF` - Gets DOFs for volumetric elements +- `GetVertexDOF` - Gets DOFs for element vertices + +Need any additional details about these methods? + +## Example + +import EXAMPLE93 from "./examples/_GetFaceDOF_test_1.md"; + + diff --git a/docs/docs-api/FEDOF/GetGlobalElemShapeData.md b/docs/docs-api/FEDOF/GetGlobalElemShapeData.md new file mode 100644 index 00000000..16a02e9c --- /dev/null +++ b/docs/docs-api/FEDOF/GetGlobalElemShapeData.md @@ -0,0 +1,88 @@ +# GetGlobalElemShapeData + +The `GetGlobalElemShapeData` method computes the global element shape function data (including shape functions, their derivatives, and related information) for a specified element. This method takes the local element shape function data and transforms it to the global coordinate system using the nodal coordinates provided in `xij`. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE GetGlobalElemShapeData(obj, globalElement, elemsd, & + xij, geoElemsd, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! Abstract finite element + INTEGER(I4B), INTENT(IN) :: globalElement + !! shape function data + TYPE(ElemshapeData_), INTENT(INOUT) :: elemsd + !! global element shape data + REAL(DFP), INTENT(IN) :: xij(:, :) + !! nodal coordinates of element + !! The number of rows in xij should be same as the spatial dimension + !! The number of columns should be same as the number of nodes + !! present in the reference element in geoElemsd. + TYPE(ElemShapeData_), OPTIONAL, INTENT(INOUT) :: geoElemsd + !! shape function data for geometry which contains local shape function + !! data. If not present then the local shape function in elemsd + !! will be used for geometry. This means we are dealing with + !! isoparametric shape functions. + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then the global element is a local element + END SUBROUTINE GetGlobalElemShapeData +END INTERFACE +``` + +## Parameters + +| Parameter | Type | Intent | Description | +| --------------- | ---------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `obj` | `CLASS(FEDOF_)` | `INTENT(INOUT)` | The FEDOF object instance | +| `globalElement` | `INTEGER(I4B)` | `INTENT(IN)` | The global element number for which to compute shape function data | +| `elemsd` | `TYPE(ElemshapeData_)` | `INTENT(INOUT)` | Output variable that will contain the global element shape data | +| `xij` | `REAL(DFP)` | `INTENT(IN)` | Nodal coordinates of the element. The number of rows in `xij` should match the spatial dimension, and the number of columns should match the number of nodes in the reference element | +| `geoElemsd` | `TYPE(ElemShapeData_)` | `OPTIONAL, INTENT(INOUT)` | Shape function data for geometry which contains local shape function data. If not present, the local shape function in `elemsd` will be used for geometry (isoparametric case) | +| `islocal` | `LOGICAL(LGT)` | `OPTIONAL, INTENT(IN)` | If true, `globalElement` is treated as a local element number rather than a global element number | + +## Implementation Details + +The method performs the following operations: + +1. Obtains the element topology index for the specified element +2. Performs error checking in debug mode to ensure the element topology index is valid and the finite element pointer is associated +3. Delegates the actual computation to the appropriate finite element object's `GetGlobalElemShapeData` method + +## Usage Example + +```fortran +TYPE(FEDOF_) :: myFEDOF +TYPE(ElemshapeData_) :: elemsd +REAL(DFP), ALLOCATABLE :: xij(:, :) +INTEGER(I4B) :: elemNum + +! Initialize myFEDOF and prepare xij with nodal coordinates +! ... + +! Get the global element shape data +CALL myFEDOF%GetGlobalElemShapeData(globalElement=elemNum, elemsd=elemsd, xij=xij) + +! Now elemsd contains the shape functions and derivatives in the global coordinate system +``` + +## Notes + +- This method is part of the core functionality for finite element computations, as it provides the necessary information for evaluating functions and their derivatives in the global coordinate system. +- The transformation from local to global coordinates is handled internally by the finite element implementation. +- If `geoElemsd` is not provided, the method will use an isoparametric formulation where the same shape functions are used for both the solution field and the geometry. +- Debug mode provides additional error checking to ensure the element topology index is valid and required pointers are associated. + +Would you like additional information or clarification about any aspect of this method? + +## Example 1 + +import EXAMPLE65 from "./examples/_GetLocalElemshapeData_test_1.md"; + + + +## Example 2 + +import EXAMPLE66 from "./examples/_GetLocalElemshapeData_test_2.md"; + + diff --git a/docs/docs-api/FEDOF/GetLocalElemShapeData.md b/docs/docs-api/FEDOF/GetLocalElemShapeData.md new file mode 100644 index 00000000..9821079c --- /dev/null +++ b/docs/docs-api/FEDOF/GetLocalElemShapeData.md @@ -0,0 +1,73 @@ +# GetLocalElemShapeData + +The `GetLocalElemShapeData` method retrieves local element shape function data for a specific element in a finite element mesh. This method acts as a dispatcher that calls the appropriate shape function evaluation method based on the continuity and interpolation type of the finite element space. + +## Syntax + +```fortran +CALL obj%GetLocalElemShapeData(globalElement, elemsd, quad, islocal) +``` + +## Arguments + +| Argument | Intent | Description | +| --------------- | ---------------- | ---------------------------------------------------------------------------- | +| `obj` | `INOUT` | An instance of the `FEDOF_` class | +| `globalElement` | `IN` | Global element number (or local element number if `islocal=.TRUE.`) | +| `elemsd` | `INOUT` | `ElemShapedata_` object to store the shape function data | +| `quad` | `IN` | `QuadraturePoint_` object containing quadrature points | +| `islocal` | `IN`, `OPTIONAL` | Logical flag - if true, `globalElement` is treated as a local element number | + +## Description + +This method determines the appropriate shape function evaluation strategy based on the case name derived from the basis continuity and interpolation type. Currently, it supports: + +- `H1LAGR`: H1-conforming Lagrange interpolation +- `H1HIER`: H1-conforming Hierarchical interpolation + +The method dispatches to the appropriate specialized method: + +- `GetLocalElemShapeDataH1Lagrange` for Lagrange interpolation +- `GetLocalElemShapeDataH1Hierarchical` for Hierarchical interpolation + +## Implementation Details + +The method performs the following steps: + +1. Obtains the case name by calling `obj%GetCaseName()` +2. Uses a SELECT CASE statement to call the appropriate specialized method +3. Raises an error if no matching case is found + +## Example Usage + +```fortran +TYPE(FEDOF_) :: fedof +TYPE(ElemShapedata_) :: elemsd +TYPE(QuadraturePoint_) :: quad +INTEGER :: elemNumber + +! Initialize fedof, elemsd, quad, and elemNumber + +! Get local element shape data +CALL fedof%GetLocalElemShapeData(globalElement=elemNumber, elemsd=elemsd, quad=quad) +``` + +## Notes + +- The method depends on the continuity and interpolation type settings in the FEDOF object +- Error checking is performed in debug mode to ensure the element is valid +- This method serves as a high-level interface to different shape function implementations + +Would you like me to explain any specific part of this method in more detail? + +## Example 1 + +import EXAMPLE65 from "./examples/_GetLocalElemshapeData_test_1.md"; + + + +## Example 2 + +import EXAMPLE66 from "./examples/_GetLocalElemshapeData_test_2.md"; + + diff --git a/docs/docs-api/FEDOF/GetMaxTotalConnectivity.md b/docs/docs-api/FEDOF/GetMaxTotalConnectivity.md new file mode 100644 index 00000000..86cec00b --- /dev/null +++ b/docs/docs-api/FEDOF/GetMaxTotalConnectivity.md @@ -0,0 +1,79 @@ +# GetMaxTotalConnectivity + +## Interface + +```fortran +MODULE FUNCTION obj_GetMaxTotalConnectivity(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B) :: ans +END FUNCTION obj_GetMaxTotalConnectivity +``` + +## Description + +The `GetMaxTotalConnectivity` method determines the maximum number of degrees of freedom (DOF) associated with any single element in the mesh. This value represents the largest connectivity array size needed to store all DOFs for any element, which is crucial for pre-allocating arrays in finite element assembly operations. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `INTEGER(I4B)`, maximum connectivity size across all elements + +### Implementation Details + +The implementation iterates through all elements in the mesh, calculates the total DOF for each element, and keeps track of the maximum value: + +```fortran +ans = 0 +telems = obj%mesh%GetTotalElements() + +DO ii = 1, telems + tdof = obj%GetTotalDOF(globalElement=ii, isLocal=.TRUE.) + ans = MAX(ans, tdof) +END DO +``` + +This efficient approach ensures that the returned value is large enough to accommodate the connectivity of any element in the mesh. + +## Usage Example + +```fortran +! Example to get the maximum connectivity size +INTEGER(I4B) :: maxConnSize +TYPE(FEDOF_) :: myDOF + +! Get maximum connectivity size +maxConnSize = myDOF%GetMaxTotalConnectivity() + +! Use this value to allocate arrays for element operations +INTEGER(I4B), ALLOCATABLE :: elemDOFs(:) +ALLOCATE (elemDOFs(maxConnSize)) + +! Now elemDOFs is guaranteed to be large enough for any element +! in the mesh, regardless of element type or polynomial order +``` + +## Important Notes + +1. This method is particularly valuable in heterogeneous meshes where different element types or polynomial orders are used +2. The returned value is often cached in the `maxTotalConnectivity` member variable to avoid recalculation +3. This method can be computationally expensive for large meshes as it loops through all elements + +## Related Methods + +- `GetTotalDOF` - Used internally to calculate the DOF count for each element +- `GetConnectivity` - Returns the actual connectivity for a specific element +- `GetConnectivity_` - Lower-level method for retrieving element connectivity + +The `GetMaxTotalConnectivity` method is an important utility function for memory management in finite element codes, ensuring that sufficient memory is allocated for element-wise operations without excessive over-allocation. + +## Example 1 + +import EXAMPLE71 from "./examples/_GetMaxTotalConnectivity_test_1.md"; + + + +## Example 2 + +import EXAMPLE72 from "./examples/_GetMaxTotalConnectivity_test_2.md"; + + diff --git a/docs/docs-api/FEDOF/GetMeshPointer.md b/docs/docs-api/FEDOF/GetMeshPointer.md new file mode 100644 index 00000000..069dec23 --- /dev/null +++ b/docs/docs-api/FEDOF/GetMeshPointer.md @@ -0,0 +1,52 @@ +# GetMeshPointer + +## Interface + +```fortran +MODULE FUNCTION obj_GetMeshPointer(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CLASS(AbstractMesh_), POINTER :: ans +END FUNCTION obj_GetMeshPointer +``` + +## Description + +The `GetMeshPointer` method returns a pointer to the mesh object associated with the FEDOF (Finite Element Degrees of Freedom) instance. This method provides access to the underlying mesh structure without transferring ownership. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `CLASS(AbstractMesh_), POINTER`, pointer to the mesh object + +This allows client code to access the mesh for further operations without needing to duplicate the mesh data. + +## Usage Example + +```fortran +! Example to get the mesh pointer +CLASS(AbstractMesh_), POINTER :: meshPtr +TYPE(FEDOF_) :: myDOF + +! Get the mesh pointer +meshPtr => myDOF%GetMeshPointer() + +! Now use the mesh pointer for operations +IF (ASSOCIATED(meshPtr)) THEN + numElements = meshPtr%GetTotalElements() + ! Other mesh operations... +END IF +``` + +## Important Notes + +1. The returned pointer should not be deallocated by the caller, as the FEDOF object maintains ownership of the mesh. +2. The pointer becomes invalid if the parent FEDOF object is deallocated. +3. This is a read-only operation that doesn't modify the FEDOF object (hence the `INTENT(IN)` for `obj`). + +## Related Methods + +- `GetConnectivity` - Uses the mesh to retrieve element connectivity +- `GetTotalDOF` - Often uses mesh information to calculate DOF counts +- `GetOrders` - Requires mesh information to map between local and global entities + +The `GetMeshPointer` method is useful when operations need direct access to the underlying mesh structure for topological or geometric queries that the FEDOF object doesn't directly expose. diff --git a/docs/docs-api/FEDOF/GetOrders.md b/docs/docs-api/FEDOF/GetOrders.md new file mode 100644 index 00000000..1e9fb5e8 --- /dev/null +++ b/docs/docs-api/FEDOF/GetOrders.md @@ -0,0 +1,125 @@ +# GetOrders + +The `GetOrders` method retrieves the cell order, face order, edge order, and their respective orientation information for a specified element in a finite element mesh. This method is part of the `FEDOF_` class which appears to handle Finite Element Degrees of Freedom. + +## Interface + +```fortran +MODULE SUBROUTINE GetOrders(obj, cellOrder, faceOrder, edgeOrder, cellOrient, + faceOrient, edgeOrient, tCellOrder, tFaceOrder, + tEdgeOrder, tCellOrient, tFaceOrient, tEdgeOrient, + globalElement, islocal) +``` + +## Parameters + +### Input Parameters + +- `obj` : `CLASS(FEDOF_), INTENT(IN)` + - The FEDOF object instance containing the finite element discretization information. + +- `globalElement` : `INTEGER(I4B), INTENT(IN)` + - The global or local element number for which order information is requested. + +- `islocal` : `LOGICAL(LGT), OPTIONAL, INTENT(IN)` + - If present and true, indicates that `globalElement` is a local element number. + - If omitted or false, `globalElement` is treated as a global element number. + +### Output/Inout Parameters + +- `cellOrder` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store the cell order information. + - Size should be at least 1. + +- `faceOrder` : `INTEGER(I4B), INTENT(INOUT)(:,:)` + - 2D array to store face order information. + - First dimension (rows) should be 3. + - Second dimension (columns) should be at least equal to the total number of faces in the element. + +- `edgeOrder` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store edge order information. + - Size should be at least equal to the total number of edges in the element. + +- `cellOrient` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store cell orientation information. + - Size should be at least 1. + +- `faceOrient` : `INTEGER(I4B), INTENT(INOUT)(:,:)` + - 2D array to store face orientation flags. + - First dimension (rows) should be 3. + - Second dimension (columns) should be at least equal to the total number of faces. + +- `edgeOrient` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store edge orientation flags. + - Size should be at least equal to the total number of edges. + +- `tCellOrder` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `cellOrder`. + +- `tFaceOrder` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `faceOrder` (number of faces). + +- `tEdgeOrder` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `edgeOrder` (number of edges). + +- `tCellOrient` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `cellOrient`. + +- `tFaceOrient` : `INTEGER(I4B), INTENT(OUT)(2)` + - Returns the size of data written in `faceOrient`. + +- `tEdgeOrient` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `edgeOrient`. + +## Description + +The `GetOrders` method retrieves polynomial order information and orientation flags for a specified element in the finite element mesh. This includes: + +1. The polynomial order of the cell (element) +2. The polynomial orders of all faces of the element +3. The polynomial orders of all edges of the element +4. The orientation flags for the cell, faces, and edges + +The method first converts the global element number to a local element number if needed, then retrieves the connectivity information of the element from the underlying mesh. This connectivity information is used to index into the stored order and orientation data for the element, faces, and edges. + +For face orders, the method copies the same order value to all three components (rows 1-3) of the corresponding face. + +The orientation information is retrieved separately from the mesh using its `GetOrientation` method. + +## Return Values + +This subroutine does not return a value directly but fills the provided arrays with the requested information and returns the sizes of the filled data through the `tCellOrder`, `tFaceOrder`, `tEdgeOrder`, `tCellOrient`, `tFaceOrient`, and `tEdgeOrient` parameters. + +## Implementation Details + +1. Converts global element number to local if needed +2. Retrieves element connectivity information from the mesh +3. Extracts cell order for the specified element +4. Extracts face orders for all faces of the element +5. Extracts edge orders for all edges of the element +6. Retrieves orientation information for the cell, faces, and edges + +## Usage Example + +```fortran +! Assuming obj is an initialized FEDOF_ object +INTEGER(I4B) :: cellOrder(1), faceOrder(3, 6), edgeOrder(12) +INTEGER(I4B) :: cellOrient(1), faceOrient(3, 6), edgeOrient(12) +INTEGER(I4B) :: tCellOrder, tFaceOrder, tEdgeOrder +INTEGER(I4B) :: tCellOrient, tFaceOrient(2), tEdgeOrient +INTEGER(I4B) :: elemID = 5 +LOGICAL(LGT) :: isLocal = .FALSE. + +! Get orders and orientations for element 5 (global numbering) +CALL obj%GetOrders(cellOrder, faceOrder, edgeOrder, & + cellOrient, faceOrient, edgeOrient, & + tCellOrder, tFaceOrder, tEdgeOrder, & + tCellOrient, tFaceOrient, tEdgeOrient, & + elemID, isLocal) +``` + +## Notes + +- The method assumes that the underlying mesh structure has been properly initialized. +- The arrays passed to this method should be pre-allocated with sufficient size to hold the data. +- Face order is replicated across all three rows of the `faceOrder` array for each face. diff --git a/docs/docs-api/FEDOF/GetPrefix.md b/docs/docs-api/FEDOF/GetPrefix.md new file mode 100644 index 00000000..73ddbdfd --- /dev/null +++ b/docs/docs-api/FEDOF/GetPrefix.md @@ -0,0 +1,14 @@ +# GetPrefix + +Returns the prefix used for setting data in FEDOF. + +## Interface + +```fortran +INTERFACE + MODULE FUNCTION GetPrefix(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CHARACTER(:), ALLOCATABLE :: ans + END FUNCTION GetPrefix +END INTERFACE +``` diff --git a/docs/docs-api/FEDOF/GetQuadraturePoints.md b/docs/docs-api/FEDOF/GetQuadraturePoints.md new file mode 100644 index 00000000..15923de3 --- /dev/null +++ b/docs/docs-api/FEDOF/GetQuadraturePoints.md @@ -0,0 +1,169 @@ +# GetQuadraturePoints + +The `GetQuadraturePoints` method generates quadrature points for numerical integration over a finite element. + +## Interface 1 + +```fortran +MODULE SUBROUTINE obj_GetQuadraturePoints1(obj, quad, globalElement, & + quadratureType, order, alpha, beta, lambda, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! fedof object + TYPE(QuadraturePoint_), INTENT(INOUT) :: quad + !! quadrature points + INTEGER(I4B), INTENT(IN) :: globalElement + !! global element number + INTEGER(I4B), INTENT(IN) :: quadratureType + !! Type of quadrature points + !! GaussLegendre ! GaussLegendreLobatto + !! GaussLegendreRadau, GaussLegendreRadauLeft + !! GaussLegendreRadauRight ! GaussChebyshev + !! GaussChebyshevLobatto ! GaussChebyshevRadau, GaussChebyshevRadauLeft + !! GaussChebyshevRadauRight + INTEGER(I4B), INTENT(IN) :: order + !! Order of integrand + !! either the order or the nips should be present + !! Both nips and order should not be present + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha + !! Jacobi parameter + REAL(DFP), OPTIONAL, INTENT(IN) :: beta + !! Jacobi parameter + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda + !! Ultraspherical parameter + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then global element is local element +END SUBROUTINE obj_GetQuadraturePoints1 +``` + +## Interface 2 + +```fortran +MODULE SUBROUTINE obj_GetQuadraturePoints2(obj, quad, globalElement, & + p, q, r, quadratureType1, quadratureType2, quadratureType3, alpha1, & + beta1, lambda1, alpha2, beta2, lambda2, alpha3, beta3, lambda3, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! abstract finite element + TYPE(QuadraturePoint_), INTENT(INOUT) :: quad + !! quadrature point + INTEGER(I4B), INTENT(IN) :: globalElement + !! global element number + INTEGER(I4B), INTENT(IN) :: p + !! order of integrand in x + INTEGER(I4B), INTENT(IN) :: q + !! order of integrand in y + INTEGER(I4B), INTENT(IN) :: r + !! order of integrand in z direction + INTEGER(I4B), INTENT(IN) :: quadratureType1 + !! Type of quadrature points ! GaussLegendre ! GaussLegendreLobatto + !! GaussLegendreRadau ! GaussLegendreRadauLeft ! GaussLegendreRadauRight + !! GaussChebyshev ! GaussChebyshevLobatto ! GaussChebyshevRadau + !! GaussChebyshevRadauLeft ! GaussChebyshevRadauRight + INTEGER(I4B), INTENT(IN) :: quadratureType2 + !! Type of quadrature points + INTEGER(I4B), INTENT(IN) :: quadratureType3 + !! Type of quadrature points + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha1, beta1, lambda1 + !! Jacobi parameter and Ultraspherical parameters + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha2, beta2, lambda2 + !! Jacobi parameter and Ultraspherical parameters + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha3, beta3, lambda3 + !! Jacobi parameter and Ultraspherical parameters + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then the global element is local element +END SUBROUTINE obj_GetQuadraturePoints2 +``` + +## Description + +The `GetQuadraturePoints` method generates quadrature points for numerical integration over a finite element. It provides two variants: + +1. `GetQuadraturePoints1` - For isotropic integration (same order in all directions) +2. `GetQuadraturePoints2` - For anisotropic integration (different orders in different directions) + +These quadrature points are essential for accurately evaluating integrals in the finite element formulation. + +### Parameters for GetQuadraturePoints1 (Isotropic) + +- `obj` - Input/Output, `CLASS(FEDOF_)`, FEDOF object instance +- `quad` - Output, `TYPE(QuadraturePoint_)`, quadrature points object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `quadratureType` - Input, `INTEGER(I4B)`, type of quadrature rule (Gauss-Legendre, Gauss-Chebyshev, etc.) +- `order` - Input, `INTEGER(I4B)`, polynomial order of the integrand +- `alpha`, `beta` - Optional Input, `REAL(DFP)`, Jacobi polynomial parameters +- `lambda` - Optional Input, `REAL(DFP)`, Ultraspherical polynomial parameter +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Parameters for GetQuadraturePoints2 (Anisotropic) + +- `obj` - Input/Output, `CLASS(FEDOF_)`, FEDOF object instance +- `quad` - Output, `TYPE(QuadraturePoint_)`, quadrature points object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `p`, `q`, `r` - Input, `INTEGER(I4B)`, polynomial orders in x, y, and z directions +- `quadratureType1`, `quadratureType2`, `quadratureType3` - Input, `INTEGER(I4B)`, quadrature rule types for each direction +- `alpha1`, `beta1`, `lambda1`, etc. - Optional Input, `REAL(DFP)`, polynomial parameters for each direction +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +Both methods determine the element topology and delegate to the appropriate finite element object: + +```fortran +ii = obj%mesh%GetElemTopologyIndx(globalElement=globalElement, islocal=islocal) + +CALL obj%fe(ii)%ptr%GetQuadraturePoints(quad=quad, order=order, +quadratureType = quadratureType, alpha = alpha, beta = beta, lambda = lambda) +``` + +For the anisotropic version: + +```fortran +CALL obj%fe(ii)%ptr%GetQuadraturePoints(quad=quad, p=p, q=q, r=r, +quadratureType1 = quadratureType1, quadratureType2 = quadratureType2, +quadratureType3 = quadratureType3, alpha1 = alpha1, beta1 = beta1, +lambda1 = lambda1, alpha2 = alpha2, beta2 = beta2, lambda2 = lambda2, +alpha3 = alpha3, beta3 = beta3, lambda3 = lambda3) +``` + +## Usage Example + +```fortran +! Example to get quadrature points for numerical integration +USE QuadraturePoint_Class +TYPE(QuadraturePoint_) :: myQuad +TYPE(FEDOF_) :: myDOF + +! Isotropic quadrature (same order in all directions) +CALL myDOF%GetQuadraturePoints(quad=myQuad, globalElement=5, & + quadratureType=GaussLegendre, order=4) + +! Anisotropic quadrature (different orders in different directions) +CALL myDOF%GetQuadraturePoints(quad=myQuad, globalElement=5, & + p=4, q=3, r=2, & + quadratureType1=GaussLegendre, & + quadratureType2=GaussLegendre, & + quadratureType3=GaussLegendre) + +! Now use myQuad for numerical integration +! ... +``` + +## Important Notes + +1. The `quadratureType` parameters should use predefined constants for different quadrature rules +2. The order should typically be at least twice the polynomial order of the element for accurate integration +3. Special parameters (alpha, beta, lambda) allow customization of certain quadrature rules +4. Different element types (triangles, tetrahedra, etc.) require appropriate quadrature rule selections + +## Related Methods + +- `GetLocalElemShapeData` - Uses quadrature points to evaluate shape functions +- `GetGlobalElemShapeData` - Maps quadrature points to the global coordinate system +- `GetCellOrder` - Can be used to determine appropriate integration order + +The `GetQuadraturePoints` method is a fundamental component of finite element analysis, providing the integration points and weights necessary for accurately evaluating weak form integrals in the finite element method. + +## Example 1 + +import EXAMPLE163 from "./examples/_GetQuadraturePoints_test_1.md"; + + diff --git a/docs/docs-api/FEDOF/GetTotalCellDOF.md b/docs/docs-api/FEDOF/GetTotalCellDOF.md new file mode 100644 index 00000000..133d47d5 --- /dev/null +++ b/docs/docs-api/FEDOF/GetTotalCellDOF.md @@ -0,0 +1,77 @@ +# GetTotalCellDOF + +The `GetTotalCellDOF` method in the `FEDOF_Class` provides the total number of degrees of freedom (DOF) associated with a cell in a finite element mesh. + +## Interface + +From the `FEDOF_Class.F90` file, the `GetTotalCellDOF` method has the following interface: + +```fortran +PROCEDURE, PUBLIC, PASS(obj) :: GetTotalCellDOF => obj_GetTotalCellDOF +!! Get total cell degrees of freedom +``` + +The specific interface is defined as: + +```fortran +MODULE FUNCTION obj_GetTotalCellDOF(obj, globalCell, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalCell + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalCellDOF +``` + +## Description + +The `GetTotalCellDOF` method calculates the total number of degrees of freedom associated with a specific cell (volumetric element) in a finite element mesh. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalCell` - Input, `INTEGER(I4B)`, global cell number or local cell number (depends on islocal) +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalCell` is treated as a local cell number +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified cell + +### Implementation Details + +The implementation uses the internal cell index array structure to calculate the total DOF count: + +```fortran +INTEGER(I4B) :: jj +jj = obj%mesh%GetLocalElemNumber(globalElement=globalCell, islocal=islocal) +ans = obj%cellIA(jj + 1) - obj%cellIA(jj) +``` + +This efficiently computes the number of DOFs by finding the difference between consecutive indices in the compressed sparse row format that stores the cell degrees of freedom. + +## Usage Example + +```fortran +! Example to get total DOFs on a cell +INTEGER(I4B) :: totalDOFs +TYPE(FEDOF_) :: myDOF + +! Get total DOFs on cell #5 +totalDOFs = myDOF%GetTotalCellDOF(globalCell=5) + +! Get total DOFs using local cell numbering +totalDOFs = myDOF%GetTotalCellDOF(globalCell=2, islocal=.TRUE.) +``` + +## Related Methods + +- `GetCellDOF` - Retrieves the actual DOF indices for a cell +- `GetTotalEdgeDOF` - Gets total DOF count for element edges +- `GetTotalFaceDOF` - Gets total DOF count for element faces +- `GetTotalVertexDOF` - Gets total DOF count for vertices +- `GetTotalDOF` - Gets total DOF count for an entire element or the entire mesh + +These methods together provide a complete interface for accessing and counting degrees of freedom in different components of the finite element mesh hierarchy (vertices, edges, faces, cells). + +## Example 1 + +import EXAMPLE74 from "./examples/_GetTotalCellDOF_test_1.md"; + + + diff --git a/docs/docs-api/FEDOF/GetTotalDOF.md b/docs/docs-api/FEDOF/GetTotalDOF.md new file mode 100644 index 00000000..4e729adf --- /dev/null +++ b/docs/docs-api/FEDOF/GetTotalDOF.md @@ -0,0 +1,128 @@ +# GetTotalDOF + +These methods provide a comprehensive interface for querying degree of freedom information at different levels of granularity, from global system-wide counts to element-specific and entity-specific counts. + +| Method | Purpose | +| ---------------- | ------------------------------------------------------------------- | +| **GetTotalDOF1** | Returns the total number of degrees of freedom in the entire domain | +| **GetTotalDOF2** | Returns the total number of DOFs for a specific element | +| **GetTotalDOF3** | Returns filtered DOFs for a specific element based on entity type | + +## Interface 1 + +```fortran +MODULE FUNCTION obj_GetTotalDOF1(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalDOF1 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `ans`: Integer result containing the total number of degrees of freedom + +### Functionality + +This method returns the total number of degrees of freedom in the entire FEDOF object. It simply returns the `tdof` field of the object, which represents the global count of all degrees of freedom across the domain. + +## Interface 2 + +```fortran +MODULE FUNCTION obj_GetTotalDOF2(obj, globalElement, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalDOF2 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalElement`: Global element number to retrieve the total DOFs for +- `islocal`: Optional logical flag - if true, globalElement is treated as a local element number +- `ans`: Integer result containing the total number of degrees of freedom for the specified element + +### Functionality + +This method returns the total number of degrees of freedom associated with a specific element. It: + +1. Gets the element data pointer for the specified element +2. Retrieves the total entities (points, edges, faces, cells) for the element +3. Counts vertex node DOFs +4. Adds the DOFs from all edges of the element +5. Adds the DOFs from all faces of the element +6. Adds the DOFs from the cell itself +7. Returns the total sum as the result + +## Interface 3 + +```fortran +MODULE FUNCTION obj_GetTotalDOF3(obj, globalElement, opt, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local element number + CHARACTER(*), INTENT(IN) :: opt + !! opt for Vertex, Edge, Face, Cell, and All + !! opt = Vertex + !! opt = Edge + !! opt = Face + !! opt = Cell + !! opt = All + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if islocal true then globalElement is local element number + INTEGER(I4B) :: ans + !! Total number of dof in the FEDOF with opt filter +END FUNCTION obj_GetTotalDOF3 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalElement`: Global element number to retrieve the total DOFs for +- `opt`: Filter option specifying which type of DOFs to count + - "Vertex" or "V" - Only count vertex DOFs + - "Edge" or "E" - Only count edge DOFs + - "Face" or "F" - Only count face DOFs + - "Cell" or "C" - Only count cell DOFs + - Any other value - Count all DOFs (same as GetTotalDOF2) +- `islocal`: Optional logical flag - if true, globalElement is treated as a local element number +- `ans`: Integer result containing the filtered total of degrees of freedom + +### Functionality + +This method is similar to GetTotalDOF2 but allows filtering the DOF count by entity type. It: + +1. Gets the element data pointer for the specified element +2. Checks the first character of the opt parameter to determine which entity types to include +3. Calls the appropriate internal subroutine(s) to count DOFs for the selected entity types: + - onlyVertex: Counts vertex DOFs + - onlyEdge: Counts edge DOFs + - onlyFace: Counts face DOFs + - onlyCell: Counts cell DOFs +4. Returns the total sum as the result + +## Usage + +The generic `GetTotalDOF` method is fundamental in finite element analysis for: + +- Allocating memory for element matrices and vectors +- Determining the size of local element contributions +- Computing the total size of the global system +- Estimating computational requirements +- Filtering DOFs by entity type for specialized operations + +This flexible interface allows for both global analysis (total DOFs in the system), local element-wise operations (DOFs per element), and entity-specific queries (e.g., only edge DOFs), providing comprehensive flexibility in how degree of freedom information is accessed throughout the finite element code. + +## Example 1 + +import EXAMPLE120 from "./examples/_GetTotalDOF_test_1.md"; + + + +## Example 2 + +import EXAMPLE121 from "./examples/_GetTotalDOF_test_2.md"; + + diff --git a/docs/docs-api/FEDOF/GetTotalEdgeDOF.md b/docs/docs-api/FEDOF/GetTotalEdgeDOF.md new file mode 100644 index 00000000..2e42dd38 --- /dev/null +++ b/docs/docs-api/FEDOF/GetTotalEdgeDOF.md @@ -0,0 +1,93 @@ +# GetTotalEdgeDOF + +The `GetTotalEdgeDOF` generic method in the `FEDOF_Class` provides the total number of degrees of freedom (DOF) associated with an edge in a finite element mesh. + +## Interface + +```fortran +MODULE FUNCTION obj_GetTotalEdgeDOF1(obj, globalEdge, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalEdge + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalEdgeDOF1 + +MODULE FUNCTION obj_GetTotalEdgeDOF2(obj, globalElement, localEdgeNumber, & + islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local cell element number + INTEGER(I4B), INTENT(IN) :: localEdgeNumber + !! local edge number in global element + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + !! if true then globalElement is local element + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalEdgeDOF2 +``` + +## Description + +The `GetTotalEdgeDOF` generic method provides two implementations to retrieve the total edge DOF count: + +1. `GetTotalEdgeDOF1` - Gets total DOF count directly using a global edge number +2. `GetTotalEdgeDOF2` - Gets total DOF count using a global element number and local edge number within that element + +## Interface 1: GetTotalEdgeDOF1 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalEdge` - Input, `INTEGER(I4B)`, global edge number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalEdge` is treated as a local edge number +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified edge + +### Implementation Details + +The implementation uses the internal edge index array structure to calculate the total DOF count: + +```fortran +ans = obj%edgeIA(globalEdge + 1) - obj%edgeIA(globalEdge) +``` + +## Interface 2: GetTotalEdgeDOF2 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalElement` - Input, `INTEGER(I4B)`, global or local cell element number +- `localEdgeNumber` - Input, `INTEGER(I4B)`, local edge number in global element +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified edge + +### Implementation Details + +This implementation first converts the element and local edge information to a global edge number, then calls the first implementation: + +```fortran +INTEGER(I4B) :: globalEdge +globalEdge = obj%mesh%GetGlobalEdgeNumber(globalElement=globalElement, & + islocal=islocal, localEdgeNumber=localEdgeNumber) +ans = obj%GetTotalEdgeDOF(globalEdge=globalEdge, islocal=islocal) +``` + +## Usage Example + +```fortran +! Example to get total DOFs on an edge +INTEGER(I4B) :: totalDOFs +TYPE(FEDOF_) :: myDOF + +! Method 1: Using global edge number +totalDOFs = myDOF%GetTotalEdgeDOF(globalEdge=8) + +! Method 2: Using element and local edge number +totalDOFs = myDOF%GetTotalEdgeDOF(globalElement=15, localEdgeNumber=3) +``` + +## Related Methods + +- `GetEdgeDOF` - Retrieves the actual DOF indices for an edge +- `GetTotalFaceDOF` - Similar function but for element faces +- `GetTotalDOF` - Gets total DOF count for an entire element or the entire mesh +- `GetTotalVertexDOF` - Gets total DOF count for vertices + diff --git a/docs/docs-api/FEDOF/GetTotalFaceDOF.md b/docs/docs-api/FEDOF/GetTotalFaceDOF.md new file mode 100644 index 00000000..2a4d66ba --- /dev/null +++ b/docs/docs-api/FEDOF/GetTotalFaceDOF.md @@ -0,0 +1,116 @@ +# GetTotalFaceDOF + +The `GetTotalFaceDOF` generic method in the `FEDOF_Class` provides the total number of degrees of freedom (DOF) associated with a face in a finite element mesh. + +## Interfaces + +From the `FEDOF_Class.F90` file, the `GetTotalFaceDOF` generic method has the following interfaces: + +```fortran +PROCEDURE, PASS(obj) :: GetTotalFaceDOF1 => GetTotalFaceDOF1 +!! Get total face dof +PROCEDURE, PASS(obj) :: GetTotalFaceDOF2 => GetTotalFaceDOF2 +!! Get total face dof from global element and local face number +GENERIC, PUBLIC :: GetTotalFaceDOF => GetTotalFaceDOF1, GetTotalFaceDOF2 +``` + +The specific interfaces are defined as: + +```fortran +MODULE FUNCTION GetTotalFaceDOF1(obj, globalFace, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalFace + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + INTEGER(I4B) :: ans +END FUNCTION GetTotalFaceDOF1 + +MODULE FUNCTION GetTotalFaceDOF2(obj, globalElement, localFaceNumber, & + islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + !! DOF object + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local element number + INTEGER(I4B), INTENT(IN) :: localFaceNumber + !! local face number in globall element + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + !! if true then globalElement is local element + INTEGER(I4B) :: ans + !! Total number of degree of freedom on face +END FUNCTION GetTotalFaceDOF2 +``` + +## Description + +The `GetTotalFaceDOF` generic method provides two implementations to retrieve the total face DOF count: + +1. `GetTotalFaceDOF1` - Gets total DOF count directly using a global face number +2. `GetTotalFaceDOF2` - Gets total DOF count using a global element number and local face number within that element + +## Interface 1: GetTotalFaceDOF1 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalFace` - Input, `INTEGER(I4B)`, global face number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalFace` is treated as a local face number +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified face + +### Implementation Details + +The implementation uses the internal face index array structure to calculate the total DOF count: + +```fortran +ans = obj%faceIA(globalface + 1) - obj%faceIA(globalface) +``` + +This efficiently computes the number of DOFs by finding the difference between consecutive indices in the compressed sparse row format. + +## Interface 2: GetTotalFaceDOF2 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, DOF object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `localFaceNumber` - Input, `INTEGER(I4B)`, local face number in global element +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element +- `ans` - Output, `INTEGER(I4B)`, total number of degrees of freedom on the specified face + +### Implementation Details + +This implementation first converts the element and local face information to a global face number, then calls the first implementation: + +```fortran +INTEGER(I4B) :: globalFace +globalFace = obj%mesh%GetGlobalFaceNumber(globalElement=globalElement, & + islocal=islocal, localFaceNumber=localFaceNumber) +ans = obj%GetTotalFaceDOF(globalFace=globalFace, islocal=islocal) +``` + +## Usage Example + +```fortran +! Example to get total DOFs on a face +INTEGER(I4B) :: totalDOFs +TYPE(FEDOF_) :: myDOF + +! Method 1: Using global face number +totalDOFs = myDOF%GetTotalFaceDOF(globalFace=3) + +! Method 2: Using element and local face number +totalDOFs = myDOF%GetTotalFaceDOF(globalElement=7, localFaceNumber=2) +``` + +## Related Methods + +- `GetFaceDOF` - Retrieves the actual DOF indices for a face +- `GetTotalEdgeDOF` - Similar function but for element edges +- `GetTotalDOF` - Gets total DOF count for an entire element or the entire mesh +- `GetTotalVertexDOF` - Gets total DOF count for vertices + +These methods are essential for traversing and accessing degrees of freedom in different components of the mesh hierarchy (vertices, edges, faces, cells). + +## Example 1 + +import EXAMPLE115 from "./examples/_GetTotalFaceDOF_test_1.md"; + + diff --git a/docs/docs-api/FEDOF/GetTotalVertexDOF.md b/docs/docs-api/FEDOF/GetTotalVertexDOF.md new file mode 100644 index 00000000..91100e2d --- /dev/null +++ b/docs/docs-api/FEDOF/GetTotalVertexDOF.md @@ -0,0 +1,72 @@ +# GetTotalVertexDOF + +The `GetTotalVertexDOF` method in the `FEDOF_Class` returns the total number of vertex degrees of freedom (DOFs) in a finite element discretization. In the context of EASIFEM (Expandable And Scalable Infrastructure for Finite Element Methods), vertex DOFs represent the degrees of freedom associated with the vertices/nodes of the mesh. + +## Interface + +```fortran +MODULE FUNCTION obj_GetTotalVertexDOF(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalVertexDOF +``` + +## Arguments + +| Argument | Intent | Description | +| -------- | ------ | ----------------------------- | +| `obj` | `IN` | An instance of `FEDOF_` class | + +## Returns + +| Type | Description | +| -------------- | ---------------------------------------------------------------------------------------- | +| `INTEGER(I4B)` | The total number of vertex DOFs, which is equal to the total number of nodes in the mesh | + +## Example Usage + +```fortran +PROGRAM demo +USE GlobalData +USE FEDOF_Class +USE AbstractMesh_Class + +TYPE(FEDOF_) :: dof +CLASS(AbstractMesh_), POINTER :: mesh +INTEGER(I4B) :: totalVertexDOF + +! Initialize mesh and dof objects +! ... + +! Get total vertex DOFs +totalVertexDOF = dof%GetTotalVertexDOF() + +PRINT *, "Total vertex DOFs: ", totalVertexDOF +END PROGRAM +``` + +## Implementation Details + +The implementation of `GetTotalVertexDOF` is straightforward. It returns the value of the `tNodes` member variable of the `FEDOF_` object, which represents the total number of nodes in the mesh: + +```fortran +MODULE PROCEDURE obj_GetTotalVertexDOF +ans = obj%tNodes +END PROCEDURE obj_GetTotalVertexDOF +``` + +This method is particularly useful when you need to know the number of nodal degrees of freedom in the mesh, for example, when allocating arrays or initializing data structures that depend on this count. + +## Notes + +- In many finite element applications, each vertex (node) has at least one degree of freedom. +- The method returns the total number of vertex DOFs regardless of the continuity or conformity of the basis functions used. +- For H1-conforming elements, the vertex DOFs are typically scalar values at each node. +- For vector problems (like elasticity), each vertex may have multiple DOFs (e.g., displacement in x, y, and z directions). + +## See Also + +- `GetTotalDOF`: Returns the total number of DOFs (vertex, edge, face, and cell) in the mesh +- `GetVertexDOF`: Gets the specific DOF IDs associated with a given vertex +- `GetConnectivity`: Gets the DOF connectivity for an element + diff --git a/docs/docs-api/FEDOF/GetVertexDOF.md b/docs/docs-api/FEDOF/GetVertexDOF.md new file mode 100644 index 00000000..0ef2e418 --- /dev/null +++ b/docs/docs-api/FEDOF/GetVertexDOF.md @@ -0,0 +1,76 @@ +# GetVertexDOF + +The `GetVertexDOF` method retrieves the degree of freedom (DOF) number associated with a specified vertex (node) in the mesh. In finite element analysis, each vertex in the mesh is typically assigned one or more degrees of freedom, which represent the unknown values to be solved for. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE GetVertexDOF(obj, globalNode, ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalNode + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + END SUBROUTINE GetVertexDOF +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object containing degree of freedom information +- `globalNode` - The global or local node number, depending on the value of `islocal` +- `ans` - An array that will store the degree of freedom number(s) associated with the specified node +- `tsize` - The number of degrees of freedom written to the `ans` array +- `islocal` - Optional logical flag. If present and `.TRUE.`, `globalNode` is interpreted as a local node number; otherwise, it's a global node number + +## Implementation Details + +The implementation is straightforward for vertex DOFs: + +```fortran +tsize = 1 +ans(1) = obj%mesh%GetLocalNodeNumber(globalNode, islocal=islocal) +``` + +For vertex DOFs in most finite element formulations: + +1. The method sets `tsize` to 1, indicating that one degree of freedom is associated with each vertex +2. It obtains the local node number using the mesh's `GetLocalNodeNumber` method, which converts global node numbers to local ones if necessary +3. The local node number itself is used as the degree of freedom number + +## Notes + +- This method assumes a simple one-to-one mapping between mesh vertices and degrees of freedom, which is typical for scalar problems (e.g., heat conduction, potential flow) +- For vector problems (e.g., elasticity) or higher-order problems, a more complex mapping might be needed, potentially requiring multiple DOFs per vertex +- The implementation reflects that in typical finite element numbering schemes, vertex DOFs are numbered first, followed by edge, face, and cell DOFs +- In the current implementation, the DOF number for a vertex is identical to its local node number in the mesh + +## Example Usage + +This method is typically used when assembling the global system of equations or when mapping local element matrices to the global system: + +```fortran +INTEGER(I4B) :: nodeDOF(1), tsize, nodeNum + +! Get the DOF number for node 5 +nodeNum = 5 +CALL fedof%GetVertexDOF(globalNode=nodeNum, ans=nodeDOF, tsize=tsize) + +! nodeDOF(1) now contains the DOF number for node 5 +! tsize will be 1 +``` + +This method is often called internally by other methods in the `FEDOF_` class, particularly when constructing element connectivity arrays that map local element degrees of freedom to global system degrees of freedom. + +## Example 1 + +import EXAMPLE69 from "./examples/_GetVertexDOF_test_1.md"; + + + +## Example 2 + +import EXAMPLE76 from "./examples/_GetVertexDOF_test_2.md"; + + diff --git a/docs/docs-api/FEDOF/ImportFromToml.md b/docs/docs-api/FEDOF/ImportFromToml.md index d76e3c31..759f43b7 100644 --- a/docs/docs-api/FEDOF/ImportFromToml.md +++ b/docs/docs-api/FEDOF/ImportFromToml.md @@ -4,6 +4,11 @@ title: ImportFromToml This method imports the configuration form a toml file and initiates the FEDOF instance. +The `ImportFromToml` method has two implementations: + +1. `ImportFromToml1` - Imports configuration from a TOML table that's already loaded +2. `ImportFromToml2` - Imports configuration from a TOML file by name + ## Interface 1 In this interface to import the data we specify the toml table and mesh. diff --git a/docs/docs-api/FEDOF/Initiate.md b/docs/docs-api/FEDOF/Initiate.md index a78bf878..4f03888f 100644 --- a/docs/docs-api/FEDOF/Initiate.md +++ b/docs/docs-api/FEDOF/Initiate.md @@ -1,16 +1,17 @@ ---- -sidebar_position: 4 ---- - # Initiate -This method initiates an instance of `FEDOF`. -There are several ways to initiate an instance of `FEDOF`. +This method initiates an instance of `FEDOF`. There are several ways to initiate an instance of `FEDOF`. + +The `Initiate` method has four different implementations: + +1. `Initiate1` - Initializes with homogeneous order for all elements +2. `Initiate2` - Initializes with inhomogeneous orders specified per element +3. `Initiate3` - Initializes from a parameter list +4. `Initiate4` - Initializes from an order vector defined for global elements ## Interface 1 -- Homogeneous order -- In case of `H1` Lagrange `FEDOF`, order is determined from the cell order of each mesh. +This method is for Homogeneous order, that is, all elements in the mesh have the same order. ```fortran INTERFACE @@ -48,29 +49,134 @@ INTERFACE END INTERFACE ``` +### Description + +This subroutine configures a FEDOF object by setting up the basis functions, continuity, and interpolation properties based on a given mesh and order. + +### Parameters + +| Parameter | Type | Intent | Description | +| ------------------- | ---------------------------- | ------ | ----------------------------------------------------------------------- | +| `obj` | CLASS(FEDOF_) | INOUT | The FEDOF object to be initialized. | +| `order` | INTEGER(I4B) | IN | Homogeneous polynomial order for the basis functions. | +| `mesh` | CLASS(AbstractMesh_), TARGET | IN | The computational mesh defining the spatial discretization. | +| `baseContinuity` | CHARACTER(*) | IN | Specifies the continuity of basis functions (regularity or conformity). | +| `baseInterpolation` | CHARACTER(*) | IN | Type of basis function used for interpolation. | + +### Optional Parameters + +| Parameter | Type | Intent | Optional | Description | +| ----------- | ------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| `ipType` | INTEGER(I4B) | IN | Yes | Interpolation point type. Used when `baseInterpolation` is set to Lagrange. | +| `basisType` | INTEGER(I4B) | IN | Yes | Array specifying types of basis functions used for constructing Lagrange polynomials. Used when `baseInterpolation` is Lagrange. | +| `alpha` | REAL(DFP) | IN | Yes | Alpha parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `beta` | REAL(DFP) | IN | Yes | Beta parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `lambda` | REAL(DFP) | IN | Yes | Lambda parameters for Ultraspherical polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Ultraspherical. | + +### Usage Example + +```fortran +CALL myFEDOF%Initiate(order=2, mesh=myMesh, baseContinuity="H1", & + baseInterpolation="Lagrange", ipType=GAUSS_LOBATTO) +``` + ## Interface 2 - Here order represents the order of each cell element. -- In case of `H1` Lagrange `FEDOF`, order is determined from the cell order of each mesh. +- `order` is a vector of integers, the length of `order` must be equal to the number of elements in the mesh. +- `order(i)` is the order of local element `i`. ```fortran INTERFACE MODULE SUBROUTINE Initiate(obj, order, mesh, baseContinuity, & - baseInterpolation, ipType, basisType, alpha, lambda, beta) + baseInterpolation, ipType, basisType, alpha, lambda, beta, islocal) CLASS(FEDOF_), INTENT(INOUT) :: obj + !! Finite degree of freedom object INTEGER(I4B), INTENT(IN) :: order(:) + !! Inhomogeneous value of order + !! This is order of each cell element + !! see the note on islocal CLASS(AbstractMesh_), TARGET, INTENT(IN) :: mesh + !! cell mesh CHARACTER(*), INTENT(IN) :: baseContinuity + !! continuity of basis (regularity) CHARACTER(*), INTENT(IN) :: baseInterpolation + !! basis function used for interpolation INTEGER(I4B), OPTIONAL, INTENT(IN) :: ipType + !! interpolation type + !! used when baseInterpolation is Lagrange INTEGER(I4B), OPTIONAL, INTENT(IN) :: basisType(:) + !! type of basis function used for + !! constructing the Lagrange polynomial + !! Used when baseInterpolation is Lagrange REAL(DFP), OPTIONAL, INTENT(IN) :: alpha(:) + !! alpha parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi REAL(DFP), OPTIONAL, INTENT(IN) :: beta(:) + !! beta parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi REAL(DFP), OPTIONAL, INTENT(IN) :: lambda(:) + !! lambda parameter for Ultraspherical parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Ultraspherical + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! islocal denotes whether the order(:) is based on + !! local element or global element number. + !! local element means in order(ii) ii is the local + !! element number, global element means in order(ii) ii is the + !! global element number. Note that getting local element + !! number is difficult for user, so it is better to use + !! global element number. END SUBROUTINE Initiate END INTERFACE ``` +### Description + +This subroutine configures a FEDOF object using inhomogeneous orders across mesh elements, allowing different polynomial orders for different parts of the domain. + +### Parameters + +| Parameter | Type | Intent | Description | +| ------------------- | ---------------------------- | ------ | -------------------------------------------------------------- | +| `obj` | CLASS(FEDOF_) | INOUT | The Finite Element Degree of Freedom object to be initialized. | +| `order` | INTEGER(I4B)(:) | IN | Array of polynomial orders for each cell element. | +| `mesh` | CLASS(AbstractMesh_), TARGET | IN | The computational mesh defining the spatial discretization. | +| `baseContinuity` | CHARACTER(*) | IN | Specifies the continuity of basis functions (regularity). | +| `baseInterpolation` | CHARACTER(*) | IN | Type of basis function used for interpolation. | + +### Optional Parameters + +| Parameter | Type | Intent | Description | +| ----------- | --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | +| `ipType` | INTEGER(I4B) | IN | Interpolation point type. Used when `baseInterpolation` is set to Lagrange. | +| `basisType` | INTEGER(I4B)(:) | IN | Array specifying types of basis functions used for constructing Lagrange polynomials. Used when `baseInterpolation` is Lagrange. | +| `alpha` | REAL(DFP)(:) | IN | Alpha parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `beta` | REAL(DFP)(:) | IN | Beta parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `lambda` | REAL(DFP)(:) | IN | Lambda parameters for Ultraspherical polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Ultraspherical. | +| `islocal` | LOGICAL(LGT) | IN | Specifies whether `order` array references local element numbers (TRUE) or global element numbers (FALSE, default). | + +### Usage Example + +```fortran +! Create an array with different orders for different elements +INTEGER(I4B) :: elementOrders(mesh%getTotalElements()) +elementOrders = [1, 2, 2, 3, 2, 1] ! Example orders + +CALL myFEDOF%Initiate(order=elementOrders, mesh=myMesh, & + baseContinuity="H1", baseInterpolation="Lagrange", & + ipType=GAUSS_LOBATTO, islocal=.FALSE.) +``` + +### Notes + +- The length of the `order` array must match the number of elements in the mesh. +- When `islocal` is not provided or is FALSE, the indices in `order` correspond to global element numbers. +- When `islocal` is TRUE, the indices in `order` correspond to local element numbers, which may be different from global numbering. +- Using global element numbering is generally easier for users to work with. + ## Interface 3 - This method is used to initiate `FEDOF` by using `ParameterList`. @@ -85,17 +191,28 @@ INTERFACE END INTERFACE ``` +:::warning WIP +This interface is still under development and may not be fully functional yet. +::: + ## Interface 4 -This routine is similar to the interface 2, but the order of the element is defined for global element numbers. -`order` is a two-dimensional array. The number of rows in order is equal to 2, the first row contains the global element number the second row contains the order. This routine will make `order0(:)` from `order(:,:)` and call `Initiate2`. +- This routine is similar to the Interface 2, but the order of the element is defined for global element numbers. +- This method is more useful for the user who have no idea about the local element number. +- `order` is a two-dimensional array. + - The number of rows in order is equal to 2 + - The first row contains the global element number + - The second row contains the order. + +:::note +This routine will make `order0(:)` from `order(:,:)` and call `Initiate2` method internally. +::: ```fortran INTERFACE - MODULE SUBROUTINE Initiate(obj, order, mesh, baseContinuity, & + MODULE SUBROUTINE obj_Initiate4(obj, order, mesh, baseContinuity, & baseInterpolation, ipType, basisType, alpha, beta, lambda) CLASS(FEDOF_), INTENT(INOUT) :: obj - !! FEDOF INTEGER(I4B), INTENT(IN) :: order(:, :) !! the number of columns in order is equal to total number of elements !! the number of rows in order is equal to 2 @@ -108,59 +225,91 @@ INTERFACE CHARACTER(*), INTENT(IN) :: baseInterpolation !! interpolation of basis INTEGER(I4B), OPTIONAL, INTENT(IN) :: ipType - !! interpolation point type, needed for Lagrange polynomial + !! interpolation type + !! used when baseInterpolation is Lagrange INTEGER(I4B), OPTIONAL, INTENT(IN) :: basisType(:) - !! basis type, needed for Lagrange polynomial only + !! type of basis function used for + !! constructing the Lagrange polynomial + !! Used when baseInterpolation is Lagrange REAL(DFP), OPTIONAL, INTENT(IN) :: alpha(:) !! alpha parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi REAL(DFP), OPTIONAL, INTENT(IN) :: beta(:) !! beta parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi REAL(DFP), OPTIONAL, INTENT(IN) :: lambda(:) - END SUBROUTINE Initiate + !! lambda parameter for Ultraspherical parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Ultraspherical + END SUBROUTINE obj_Initiate4 END INTERFACE ``` -## Examples +### Parameters - - +| Parameter | Type | Intent | Description | +| ------------------- | ---------------------------- | ------ | ------------------------------------------------------------- | +| `obj` | CLASS(FEDOF_) | INOUT | The FEDOF object to be initialized. | +| `order` | INTEGER(I4B)(:,:) | IN | 2×N array where N is the number of elements to be configured. | +| `mesh` | CLASS(AbstractMesh_), TARGET | IN | The computational mesh defining the spatial discretization. | +| `baseContinuity` | CHARACTER(*) | IN | Specifies the continuity of basis functions (regularity). | +| `baseInterpolation` | CHARACTER(*) | IN | Type of basis function used for interpolation. | -import EXAMPLE129 from "./examples/_Initiate_test_1.md"; +### Optional Parameters - +| Parameter | Type | Intent | Description | +| ----------- | --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | +| `ipType` | INTEGER(I4B) | IN | Interpolation point type. Used when `baseInterpolation` is set to Lagrange. | +| `basisType` | INTEGER(I4B)(:) | IN | Array specifying types of basis functions used for constructing Lagrange polynomials. Used when `baseInterpolation` is Lagrange. | +| `alpha` | REAL(DFP)(:) | IN | Alpha parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `beta` | REAL(DFP)(:) | IN | Beta parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `lambda` | REAL(DFP)(:) | IN | Lambda parameters for Ultraspherical polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Ultraspherical. | - +### Usage Example - - -import EXAMPLE139 from "./examples/_Initiate_test_2.md"; +```fortran +! Create a 2×3 array to specify orders for three specific elements +INTEGER(I4B) :: elementOrders(2, 3) +! First row: global element numbers +elementOrders(1, :) = [1, 5, 10] +! Second row: corresponding polynomial orders +elementOrders(2, :) = [2, 3, 1] + +CALL myFEDOF%Initiate(order=elementOrders, mesh=myMesh, & + baseContinuity="H1", baseInterpolation="Lagrange", & + ipType=GAUSS_LOBATTO) +``` - +### Notes - +- This interface is more user-friendly as it allows specifying orders only for elements of interest using their global numbers. +- Internally, this method constructs a complete order array and calls Interface 2. +- The number of columns in the `order` array can be less than the total number of elements in the mesh - only specified elements will receive custom orders. - +## Example (H1, Hierarchical, Uniform Order) -import EXAMPLE147 from "./examples/_Initiate_test_3.md"; +import EXAMPLE287 from "./examples/_Initiate_test_1.md"; - + - +## Example (H1, Hierarchical, Inhomogeneous Order) - +import EXAMPLE295 from "./examples/_Initiate_test_2.md"; -import EXAMPLE153 from "./examples/_Initiate_test_4.md"; + - +## Example (H1, Hierarchical, Inhomogeneous Order with Local Element Number) - +import EXAMPLE303 from "./examples/_Initiate_test_3.md"; - + -import EXAMPLE162 from "./examples/_Initiate_test_5.md"; +## Example (H1, Lagrange, Uniform Order) - +import EXAMPLE311 from "./examples/_Initiate_test_4.md"; - + - +## Example (H1, Lagrange, Inhomogeneous Order) diff --git a/docs/docs-api/FEDOF/SetSparsity.md b/docs/docs-api/FEDOF/SetSparsity.md new file mode 100644 index 00000000..de07682f --- /dev/null +++ b/docs/docs-api/FEDOF/SetSparsity.md @@ -0,0 +1,118 @@ +# SetSparsity + +The `SetSparsity` method is used to establish the sparsity pattern in a CSR (Compressed Sparse Row) matrix based on finite element degrees of freedom (FEDOF). This is a crucial operation for efficiently assembling and storing finite element matrices. The method offers two implementations to handle different sparsity pattern generation scenarios. + +## Interface 1 + +> Single FEDOF Sparsity Pattern + +```fortran +MODULE SUBROUTINE SetSparsity1(obj, mat) + CLASS(FEDOF_), INTENT(INOUT) :: obj + TYPE(CSRMatrix_), INTENT(INOUT) :: mat +END SUBROUTINE SetSparsity1 +``` + +### Purpose + +Creates a sparsity pattern in a CSR matrix using a single FEDOF object. This implementation is typically used for matrices representing operations within a single finite element space (like mass or stiffness matrices). + +### Parameters + +- `obj`: The FEDOF object that contains degree of freedom information +- `mat`: The CSR matrix where the sparsity pattern will be established + +### Algorithm + +1. Retrieves the mesh pointer from the FEDOF object +2. Allocates connectivity array based on maximum total connectivity +3. For each element in the mesh: + - Gets the connectivity for the element + - For each degree of freedom in the element: + - Sets the sparsity pattern in the matrix for this DOF with respect to all other DOFs in the element +4. Finalizes the sparsity pattern + +## Interface 2 + +> FEDOF to FEDOF Interaction + +```fortran +MODULE SUBROUTINE SetSparsity2(obj, col_fedof, cellToCell, mat, ivar, jvar) + CLASS(FEDOF_), INTENT(INOUT) :: obj + CLASS(FEDOF_), INTENT(INOUT) :: col_fedof + INTEGER(I4B), INTENT(IN) :: cellToCell(:) + TYPE(CSRMatrix_), INTENT(INOUT) :: mat + INTEGER(I4B), INTENT(IN) :: ivar + INTEGER(I4B), INTENT(IN) :: jvar +END SUBROUTINE SetSparsity2 +``` + +### Purpose + +Creates a sparsity pattern in a CSR matrix using two FEDOF objects. This implementation is used for matrices representing operations between different finite element spaces (like coupling or transfer matrices). + +### Parameters + +- `obj`: The row FEDOF object that contains degree of freedom information +- `col_fedof`: The column FEDOF object that contains degree of freedom information +- `cellToCell`: Array mapping element indices from row to column mesh +- `mat`: The CSR matrix where the sparsity pattern will be established +- `ivar`: Physical variable index in row +- `jvar`: Physical variable index in column + +### Algorithm + +1. Retrieves mesh pointers from both FEDOF objects +2. Allocates connectivity arrays for both row and column elements +3. For each element in the row mesh: + - Gets the connectivity for the row element + - Finds the corresponding element in the column mesh using cellToCell + - Gets the connectivity for the column element + - For each DOF in the row element: + - Sets the sparsity pattern in the matrix for this row DOF with respect to all column DOFs + +## Interface 3 + +> Multiple FEDOF Interactions + +```fortran +INTERFACE FEDOFSetSparsity + MODULE SUBROUTINE SetSparsity3(fedofs, mat) + CLASS(FEDOFPointer_), INTENT(INOUT) :: fedofs(:) + TYPE(CSRMatrix_), INTENT(INOUT) :: mat + END SUBROUTINE SetSparsity3 +END INTERFACE FEDOFSetSparsity +``` + +There is also a third implementation (`SetSparsity3`) that handles sparsity pattern generation for multiple FEDOF objects. This is particularly useful for complex coupled problems with multiple physics or domains. + +## Usage Example + +```fortran +! For a single FEDOF (e.g., creating a stiffness matrix) +TYPE(FEDOF_) :: myFEDOF +TYPE(CSRMatrix_) :: stiffnessMatrix + +! Set up the sparsity pattern for the matrix +CALL myFEDOF%SetSparsity(stiffnessMatrix) + +! For FEDOF to FEDOF interaction (e.g., coupling two different fields) +TYPE(FEDOF_) :: velocityFEDOF, pressureFEDOF +TYPE(CSRMatrix_) :: couplingMatrix +INTEGER(I4B), ALLOCATABLE :: cellMap(:) + +! Set up cellMap to map between velocity and pressure elements +! ... + +! Set up the sparsity pattern for the coupling matrix +CALL velocityFEDOF%SetSparsity(pressureFEDOF, cellMap, couplingMatrix, 1, 2) +``` + +## Notes + +- The sparsity pattern defines which entries in the matrix are non-zero, allowing for efficient storage and computation. +- The methods check various conditions in debug mode to ensure validity of the inputs. +- The third variant (`SetSparsity3`) is particularly useful for block matrices with multiple physical variables. +- After setting the sparsity pattern, the matrix can be assembled efficiently by only computing and storing the non-zero entries. + +## Example 1 diff --git a/docs/docs-api/FEDOF/examples/_Copy_test_1.F90 b/docs/docs-api/FEDOF/examples/_Copy_test_1.F90 new file mode 100644 index 00000000..f7e6b2c2 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_Copy_test_1.F90 @@ -0,0 +1,71 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-06 +! summary: This method tests the COPY method for FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, obj2 +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseInterpolation = "Heirarchical", & + baseContinuity = "H1" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=1, mesh=meshptr) +!CALL fedof%Display("FEDOF:") +CALL obj2%copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL OK(found == want, "Total DOF (order=1): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=2, mesh=meshptr) +obj2 = obj +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() +CALL OK(found == want, "Total DOF (order=2): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=3, mesh=meshptr) +CALL obj2%Copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=3): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=4, mesh=meshptr) +obj2 = obj + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_Initiate_test_7.md b/docs/docs-api/FEDOF/examples/_Copy_test_1.md similarity index 61% rename from docs/docs-api/FEDOF/examples/_Initiate_test_7.md rename to docs/docs-api/FEDOF/examples/_Copy_test_1.md index 91741de4..ebcca23a 100644 --- a/docs/docs-api/FEDOF/examples/_Initiate_test_7.md +++ b/docs/docs-api/FEDOF/examples/_Copy_test_1.md @@ -1,5 +1,5 @@ import CodeBlock from '@theme/CodeBlock'; -import CodeSnippet from '!!raw-loader!./_Initiate_test_7.F90'; +import CodeSnippet from '!!raw-loader!./_Copy_test_1.F90'; {CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_Copy_test_2.F90 b/docs/docs-api/FEDOF/examples/_Copy_test_2.F90 new file mode 100644 index 00000000..6e36c262 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_Copy_test_2.F90 @@ -0,0 +1,77 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-06 +! summary: This method tests the COPY method for FEDOF class. +! Copy method is same as the assignment opertor. +! Copy method is tested for H1 Lagrange on linear triangular mesh. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, obj2 +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseInterpolation = "Lagrange", & + baseContinuity = "H1" + +INTEGER(I4B), PARAMETER :: ipType = TypeQuadratureOpt%equidistance + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=1, mesh=meshptr) +!CALL fedof%Display("FEDOF:") +CALL obj2%copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL OK(found == want, "Total DOF (order=1): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=2, mesh=meshptr) +obj2 = obj +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() +CALL OK(found == want, "Total DOF (order=2): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=3, mesh=meshptr) +CALL obj2%Copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=3): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=4, mesh=meshptr) +obj2 = obj + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_Initiate_test_7.F90 b/docs/docs-api/FEDOF/examples/_GetCaseName_test_1.F90 similarity index 57% rename from docs/docs-api/FEDOF/examples/_Initiate_test_7.F90 rename to docs/docs-api/FEDOF/examples/_GetCaseName_test_1.F90 index e4ad4d15..fa818623 100644 --- a/docs/docs-api/FEDOF/examples/_Initiate_test_7.F90 +++ b/docs/docs-api/FEDOF/examples/_GetCaseName_test_1.F90 @@ -1,6 +1,6 @@ !> author: Vikas Sharma, Ph. D. -! date: 2025-06-01 -! summary: Testing initiate methods for Hierarchical DOF +! date: 2025-06-07 +! summary: Get case name PROGRAM main USE FEDOF_Class @@ -11,6 +11,7 @@ PROGRAM main USE GlobalData USE Test_Method USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeQuadratureOpt IMPLICIT NONE @@ -20,8 +21,7 @@ PROGRAM main CHARACTER(*), PARAMETER :: filename = & "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" TYPE(HDF5File_) :: meshfile -INTEGER(I4B) :: found, want -CHARACTER(:), ALLOCATABLE :: testname +CHARACTER(6) :: found, want CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") @@ -32,9 +32,21 @@ PROGRAM main CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & order=1, mesh=meshptr) -testname = "H1 Hierarchical order=1" +found = obj%GetCaseName() +want = "H1HEIR" +CALL OK(found == want, "GetCaseName H1HEIR: ") -CALL obj%Display(testname) +CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Hierarchical", & + order=1, mesh=meshptr) +found = obj%GetCaseName() +want = "H1HIER" +CALL OK(found == want, "GetCaseName H1HIER: ") + +CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Lagrange", & + order=1, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) +found = obj%GetCaseName() +want = "H1LAGR" +CALL OK(found == want, "GetCaseName H1LAGR: ") !CALL dom%Display("domain:") CALL dom%DEALLOCATE() diff --git a/docs/docs-api/FEDOF/examples/_GetCaseName_test_1.md b/docs/docs-api/FEDOF/examples/_GetCaseName_test_1.md new file mode 100644 index 00000000..4d9c7efa --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCaseName_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCaseName_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetCellDOF_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_1.F90 new file mode 100644 index 00000000..0f3e61c0 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_1.F90 @@ -0,0 +1,140 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetCellDOF_test_1.md b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_1.md new file mode 100644 index 00000000..1211c367 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCellDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetCellDOF_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_2.F90 new file mode 100644 index 00000000..ee9682c3 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_2.F90 @@ -0,0 +1,140 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetCellDOF_test_2.md b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_2.md new file mode 100644 index 00000000..fe966b7c --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCellDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetCellDOF_test_3.F90 b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_3.F90 new file mode 100644 index 00000000..3aefd59a --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_3.F90 @@ -0,0 +1,141 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetCellDOF_test_4.F90 b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_4.F90 new file mode 100644 index 00000000..0b6fc922 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellDOF_test_4.F90 @@ -0,0 +1,141 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetCellOrder_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetCellOrder_test_1.F90 new file mode 100644 index 00000000..64c3f765 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellOrder_test_1.F90 @@ -0,0 +1,133 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellOrder method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 1 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 2 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 3 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 4 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetCellOrder_test_1.md b/docs/docs-api/FEDOF/examples/_GetCellOrder_test_1.md new file mode 100644 index 00000000..28143e33 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetCellOrder_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCellOrder_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_1.F90 index a5e38124..e562f2f0 100644 --- a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_1.F90 @@ -1,3 +1,8 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + PROGRAM main USE FEDOF_Class USE FEDomain_Class @@ -12,77 +17,142 @@ PROGRAM main IMPLICIT NONE -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5", & - baseContinuity = "H1", & - baseInterpolation = "Heirarchical" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity // " " // baseInterpolation TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() TYPE(HDF5File_) :: meshfile INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces LOGICAL(LGT) :: isok -INTEGER(I4B) :: order -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') - meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() -order = 1 -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=meshptr) - -found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) - -want = meshptr%GetLocalNodenumber(globalNode= & - meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.), & - islocal=.FALSE.) -isok = ALL(found == want) -CALL OK(isok, "GetConnectivity (order=1): ") - -order = 2 -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=meshptr) - -found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) -want = want .APPEND. arange(meshptr%GetTotalNodes()+1, meshptr%GetTotalNodes()+3) -isok = ALL(found == want) -CALL OK(isok, "GetConnectivity (order=2): ") -IF (.NOT. isok) CALL Display(found.COLCONCAT.want, "found + want") - -order = 3 -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=meshptr) - -found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) -want = (meshptr%GetConnectivity(1, .TRUE.) .APPEND. & - arange(meshptr%GetTotalNodes() + 1, meshptr%GetTotalNodes() + 6)) & - .append. [meshptr%GetTotalNodes() + 2 * meshptr%GetTotalFaces() + 1] -isok = ALL(found == want) -CALL OK(isok, "GetConnectivity (order=3): ") -IF (.NOT. isok) CALL Display(found.COLCONCAT.want, "found + want") -!CALL Display(meshptr%GetTotalEntities(), "TotalEntities: ") - -!CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & -! order=3, mesh=meshptr) -!found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) -!want = meshptr%GetConnectivity(1, .TRUE.) .APPEND. & -! arange(meshptr%GetTotalNodes() + 1, meshptr%GetTotalNodes() + 6) & -! .append.arange(meshptr%GetTotalNodes() + 2 * meshptr%GetTotalFaces() + 1, & -! meshptr%GetTotalNodes() + meshptr%GetTotalFaces() * 2 + 1) -!isok = ALL(found == want) -!CALL OK(isok, "GetConnectivity (order=3): ") -!IF (.NOT. isok) CALL Display(found.COLCONCAT.want, "found + want") +CALL test1 +CALL test2 +CALL test3 CALL dom%DEALLOCATE() CALL meshfile%DEALLOCATE() +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_1.md b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_1.md new file mode 100644 index 00000000..e3288ea5 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_1.md @@ -0,0 +1,7 @@ + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetConnectivity_test_1.F90'; + +{CodeSnippet} + diff --git a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_2.F90 index 529de684..ffd45f22 100644 --- a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_2.F90 +++ b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_2.F90 @@ -1,3 +1,8 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + PROGRAM main USE FEDOF_Class USE FEDomain_Class @@ -12,41 +17,145 @@ PROGRAM main IMPLICIT NONE -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5", & - baseContinuity = "H1", & - baseInterpolation = "Lagrange" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity // " " // baseInterpolation TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() TYPE(HDF5File_) :: meshfile INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces LOGICAL(LGT) :: isok -INTEGER(I4B) :: order -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') - meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() -order = 1 -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=meshptr) - -found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) - -want = meshptr%GetLocalNodenumber(globalNode=meshptr%GetConnectivity( & - globalElement=1, islocal=.TRUE.), & - islocal=.FALSE.) -isok = ALL(found == want) -CALL OK(isok, "GetConnectivity (order=1): ") +CALL test1 +CALL test2 +CALL test3 CALL dom%DEALLOCATE() CALL meshfile%DEALLOCATE() +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices, tdof, localElemNum + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + tdof = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + localElemNum = meshptr%GetLocalElemNumber(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_2.md b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_2.md new file mode 100644 index 00000000..02f4e263 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetConnectivity_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_3.F90 b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_3.F90 index 465c69d3..f1fbf481 100644 --- a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_3.F90 +++ b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_3.F90 @@ -1,3 +1,8 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + PROGRAM main USE FEDOF_Class USE FEDomain_Class @@ -9,44 +14,146 @@ PROGRAM main USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION USE AppendUtility USE ArangeUtility +USE BaseType, ONLY: TypeQuadratureOpt IMPLICIT NONE -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_tri6_mesh.h5", & - baseContinuity = "H1", & - baseInterpolation = "Lagrange", & - test_name = "GetConnectivity (order=2): " +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity // " " // baseInterpolation TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() TYPE(HDF5File_) :: meshfile INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces LOGICAL(LGT) :: isok -INTEGER(I4B), PARAMETER :: order = 2 -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') - meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=meshptr) - -found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) - -want = meshptr%GetLocalNodenumber(globalNode=meshptr%GetConnectivity( & - globalElement=1, islocal=.TRUE.), & - islocal=.FALSE.) -isok = ALL(found == want) -CALL OK(isok, test_name) +CALL test1 +CALL test2 +CALL test3 CALL dom%DEALLOCATE() CALL meshfile%DEALLOCATE() +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetConnectivity_test_4.F90 b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_4.F90 new file mode 100644 index 00000000..4a9ad77b --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetConnectivity_test_4.F90 @@ -0,0 +1,162 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeQuadratureOpt +USE AppendUtility +USE ArangeUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices, tdof, localElemNum + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + tdof = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + localElemNum = meshptr%GetLocalElemNumber(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname//" GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname//" GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname//" GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_1.F90 new file mode 100644 index 00000000..220bd713 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_1.F90 @@ -0,0 +1,139 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + con = fedof%GetConnectivity(globalElement=1, islocal=.TRUE., opt="A") + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + + CALL fedof%GetFaceDOF(globalElement=1, islocal=.TRUE., & + ans=found, tsize=tsize, localFaceNumber=1) + isok = tsize .EQ. 0 + CALL OK(isok, testname//" interface 2 (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + + CALL fedof%GetFaceDOF(globalElement=1, islocal=.TRUE., & + ans=found, tsize=tsize, localFaceNumber=1) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + + CALL fedof%GetFaceDOF(globalElement=1, islocal=.TRUE., & + ans=found, tsize=tsize, localFaceNumber=1) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_1.md b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_1.md new file mode 100644 index 00000000..8e322a53 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetFaceDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_2.F90 new file mode 100644 index 00000000..27f66326 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_2.F90 @@ -0,0 +1,122 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + con = fedof%GetConnectivity(globalElement=1, islocal=.TRUE., opt="A") + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_2.md b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_2.md new file mode 100644 index 00000000..a00a71b7 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetFaceDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_3.F90 b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_3.F90 new file mode 100644 index 00000000..7025f8c0 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_3.F90 @@ -0,0 +1,123 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + con = fedof%GetConnectivity(globalElement=1, islocal=.TRUE., opt="A") + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_3.md b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_3.md new file mode 100644 index 00000000..7a77faa4 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetFaceDOF_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetFaceDOF_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_1.F90 index fdb5b66b..2c21ac6d 100644 --- a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_1.F90 @@ -1,5 +1,7 @@ -! Get quadrature1 tested -!! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, order, alpha, beta, lambda, islocal) +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. PROGRAM main USE FEDOF_Class @@ -13,80 +15,234 @@ PROGRAM main USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ USE QuadraturePoint_Method USE ElemshapeData_Method +USE ApproxUtility IMPLICIT NONE -TYPE(FEDOF_) :: obj +TYPE(FEDOF_) :: obj, geoobj TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + TYPE(HDF5File_) :: meshfile + TYPE(QuadraturePoint_) :: quad -TYPE(ElemshapeData_) :: elemsd -CHARACTER(:), ALLOCATABLE :: testname +TYPE(ElemshapeData_) :: elemsd, geoelemsd -INTEGER(I4B) :: globalElement, telements, order, nodecon(100), ii, jj, nsd +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd REAL(DFP) :: nodecoord(3, 100) -LOGICAL(LGT) :: islocal +LOGICAL(LGT) :: islocal, isok CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') - meshptr => dom%GetMeshPointer() nsd = meshptr%GetNSD() -CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=1, mesh=meshptr) -testname = "H1 Hierarchical order=1" +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- -! CALL obj%Display(testname) +SUBROUTINE test1 -! telements = meshptr%GetTotalElements() -telements = 1 -globalElement = 1 -order = 1 -islocal = .TRUE. + REAL(DFP) :: found(1), want(1) -! DO globalElement = 1, telements + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) -CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & quadratureType=TypeQuadratureOpt%GaussLegendre, & - order=order, islocal=islocal) + order=order, islocal=islocal) -CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & - globalElement=globalElement, islocal=islocal) + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) -CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & - globalElement=globalElement, islocal=islocal) + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) -CALL Display(nodecoord(1:nsd, 1:jj), "nodecoord: ") + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) -CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & - globalElement=globalElement, islocal=islocal) -! CALL Display(cellorder(1:tcellorder), "cellorder: ") -! CALL Display(faceorder(1:3, 1:tfaceorder), "faceorder: ") -! CALL Display(edgeorder(1:tedgeorder), "edgeOrder: ") -! CALL Display(cellOrient(1:tcellorient), "cellOrient: ") -CALL Display(globalelement, "globalelements: ") -CALL Display(order, "order: ") -! CALL Display(quad, "quad:") -! CALL Display(elemsd, "elemsd:") + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) -CALL Display(elemsd%N, "N:") -CALL Display(elemsd%dNdXi, "dNdXi:") -CALL Display(elemsd%dNdXt, "dNdXt:") + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) -! END DO + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) -!CALL dom%Display("domain:") -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_1.md b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_1.md new file mode 100644 index 00000000..97523313 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_2.F90 new file mode 100644 index 00000000..7ce923ad --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_2.F90 @@ -0,0 +1,252 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_2.md b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_2.md new file mode 100644 index 00000000..c5f0b4d6 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_3.F90 b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_3.F90 new file mode 100644 index 00000000..e2e76b12 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_3.F90 @@ -0,0 +1,252 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_3.md b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_3.md new file mode 100644 index 00000000..89d8ec04 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_4.F90 b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_4.F90 new file mode 100644 index 00000000..3be6c349 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_4.F90 @@ -0,0 +1,252 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_4.md b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_4.md new file mode 100644 index 00000000..39ab3ef1 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_4.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_4.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_5.F90 b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_5.F90 new file mode 100644 index 00000000..5c5cf2a8 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetLocalElemshapeData_test_5.F90 @@ -0,0 +1,266 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " +CHARACTER(*), PARAMETER :: myName = "GetLocalElemshapeData_test_5", & + modName = "main" + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +! CALL test2 +! CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '1') + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '2') + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '3') + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '4') + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_1.F90 index 106f574d..c86fcb3d 100644 --- a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_1.F90 @@ -1,4 +1,9 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt USE FEDOF_Class USE FEDomain_Class USE AbstractMesh_Class @@ -13,39 +18,80 @@ PROGRAM main TYPE(FEDOF_) :: obj TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5", & - baseContinuity = "H1", & - baseInterpolation = "Heirarchical" -INTEGER(I4B), PARAMETER :: order = 1 +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 TYPE(HDF5File_) :: meshfile -INTEGER(I4B) :: found, want LOGICAL(LGT) :: isok CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') - meshptr => dom%GetMeshPointer() -CALL obj%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=meshptr) -!CALL fedof%Display("FEDOF:") -found = obj%GetMaxTotalConnectivity() -want = 3 -isok = found == want - -CALL OK(isok, "GetMaxTotalConnectivity") -IF (.NOT. isok) THEN - CALL Display(found, "found: ") - CALL Display(want, "want: ") -END IF - -!CALL dom%Display("domain:") +CALL test1 +CALL test2 +CALL test3 + CALL dom%DEALLOCATE() CALL meshfile%DEALLOCATE() +CONTAINS + +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 + END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_1.md b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_1.md new file mode 100644 index 00000000..c817c3bf --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_2.F90 index 9d85434c..6538744b 100644 --- a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_2.F90 +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_2.F90 @@ -1,6 +1,12 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt USE FEDOF_Class -USE FEMesh_Class +USE FEDomain_Class +USE AbstractMesh_Class USE HDF5File_Class USE Display_Method USE GlobalData @@ -10,39 +16,82 @@ PROGRAM main IMPLICIT NONE TYPE(FEDOF_) :: obj -TYPE(FEMesh_) :: mesh -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5", & - baseContinuity = "H1", & - baseInterpolation = "Heirarchical" -INTEGER(I4B), PARAMETER :: order = 1, nsd = 2 +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 TYPE(HDF5File_) :: meshfile -INTEGER(I4B) :: found, want LOGICAL(LGT) :: isok -CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() -CALL mesh%Initiate(hdf5=meshfile, dim=nsd) +CALL test1 +CALL test2 +CALL test3 -CALL obj%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) -!CALL fedof%Display("FEDOF:") -found = obj%GetMaxTotalConnectivity() -want = 3 -isok = found == want +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() -CALL OK(isok, "GetMaxTotalConnectivity") -IF (.NOT. isok) THEN - CALL Display(found, "found: ") - CALL Display(want, "want: ") -END IF +CONTAINS -!CALL dom%Display("domain:") -CALL mesh%DEALLOCATE() -CALL meshfile%DEALLOCATE() +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_2.md b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_2.md new file mode 100644 index 00000000..29a1329e --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_3.F90 b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_3.F90 new file mode 100644 index 00000000..e8aacb22 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_3.F90 @@ -0,0 +1,97 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + +PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 + +TYPE(HDF5File_) :: meshfile +LOGICAL(LGT) :: isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_3.md b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_3.md new file mode 100644 index 00000000..7f2de94b --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_4.F90 b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_4.F90 new file mode 100644 index 00000000..6a1eeba9 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_4.F90 @@ -0,0 +1,97 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + +PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 + +TYPE(HDF5File_) :: meshfile +LOGICAL(LGT) :: isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_4.md b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_4.md new file mode 100644 index 00000000..51e10035 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetMaxTotalConnectivity_test_4.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_4.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..35cf2ce1 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_1.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Hierarchical", & + testname = baseContinuity//" "//baseInterpolation// " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname //" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_1.md b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_1.md new file mode 100644 index 00000000..b43cafd9 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_2.F90 new file mode 100644 index 00000000..7b1302e8 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_2.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Hierarchical", & + testname = baseContinuity//" "//baseInterpolation// " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname //" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_2.md b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_2.md new file mode 100644 index 00000000..bc9acd58 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_3.F90 b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_3.F90 new file mode 100644 index 00000000..4d14e785 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_3.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname //" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_3.md b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_3.md new file mode 100644 index 00000000..db585212 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_4.F90 b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_4.F90 new file mode 100644 index 00000000..17f31dfa --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_4.F90 @@ -0,0 +1,130 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// & + " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_4.md b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_4.md new file mode 100644 index 00000000..cb7dc0fc --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_4.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_4.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_5.F90 b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_5.F90 new file mode 100644 index 00000000..41e23424 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetQuadraturePoints_test_5.F90 @@ -0,0 +1,49 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate FEDOF object by import from toml + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_ +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + toml_filename = "./toml/_ImportFromToml_test_3.toml" +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%ImportFromToml(tomlName="test1", filename=toml_filename, & + dom=dom) + +CALL obj%GetQuadraturePoints(quad=quad, globalElement=1, & + islocal=.TRUE.) + +CALL Display(quad, "Quadrature points") + +! CALL obj%Display("FEDOF:") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetQuadrature_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetQuadrature_test_1.F90 deleted file mode 100644 index ca4dc704..00000000 --- a/docs/docs-api/FEDOF/examples/_GetQuadrature_test_1.F90 +++ /dev/null @@ -1,74 +0,0 @@ -! Get quadrature1 tested -!! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, order, alpha, beta, lambda, islocal) - -PROGRAM main -USE FEDOF_Class -USE FEDomain_Class -USE AbstractMesh_Class -USE HDF5File_Class -USE Display_Method -USE GlobalData -USE Test_Method -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt -USE QuadraturePoint_Method - -IMPLICIT NONE - -TYPE(FEDOF_) :: obj -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -TYPE(HDF5File_) :: meshfile -TYPE(QuadraturePoint_) :: quad - -CHARACTER(:), ALLOCATABLE :: testname - -INTEGER(I4B) :: globalElement, telements, order - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) -CALL meshfile%Initiate(filename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(meshfile, '') - -meshptr => dom%GetMeshPointer() - -CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Hierarchical", & - order=1, mesh=meshptr) -testname = "H1 Hierarchical order=1" - -! CALL obj%Display(testname) - -! telements = meshptr%GetTotalElements() -telements = 1 -globalElement = 1 -order = 2 - -! DO globalElement = 1, telements - -CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & - quadratureType=TypeQuadratureOpt%GaussLegendre, & - order=order, islocal=.TRUE.) - -! CALL Display(cellorder(1:tcellorder), "cellorder: ") -! CALL Display(faceorder(1:3, 1:tfaceorder), "faceorder: ") -! CALL Display(edgeorder(1:tedgeorder), "edgeOrder: ") -! CALL Display(cellOrient(1:tcellorient), "cellOrient: ") - -CALL Display(globalelement, "globalelements: ") -CALL Display(order, "order: ") -CALL Display(quad, "quad:") - -! END DO - -!CALL dom%Display("domain:") -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() - -END PROGRAM main - -! total nodes = 25 -! total elements = 16 -! total faces = 40 -! total edges = 0 diff --git a/docs/docs-api/FEDOF/examples/_GetTotalCellDOF_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetTotalCellDOF_test_1.F90 new file mode 100644 index 00000000..a2ff6467 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalCellDOF_test_1.F90 @@ -0,0 +1,137 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetTotalCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, want, found + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 0 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, want, found + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 0 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, want, found + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 1 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, want, found + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 3 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetTotalCellDOF_test_1.md b/docs/docs-api/FEDOF/examples/_GetTotalCellDOF_test_1.md new file mode 100644 index 00000000..60dfe858 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalCellDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalCellDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_1.F90 index 148be274..7ccb88d7 100644 --- a/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_1.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + PROGRAM main USE FEDOF_Class USE FEDomain_Class @@ -6,42 +10,179 @@ PROGRAM main USE Display_Method USE GlobalData USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + IMPLICIT NONE +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - & "../../Mesh/examples/meshdata/small_mesh.h5" TYPE(HDF5File_) :: meshfile -INTEGER(I4B) :: found, want +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') - meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=1, mesh=meshptr) -found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) -want = meshptr%GetNNE(globalElement=1, islocal=.TRUE.) -CALL OK(found == want, "GetTotalDOF (order=1): ") - -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=2, mesh=meshptr) -found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) -want = meshptr%GetNNE(globalElement=1, islocal=.TRUE.) + 3 -CALL OK(found == want, "GetTotalDOF (order=2): ") - -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=3, mesh=meshptr) -found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) -want = meshptr%GetNNE(globalElement=1, islocal=.TRUE.) + 6 + 1 -CALL OK(found == want, "GetTotalDOF (order=3): ") - -!CALL dom%Display("domain:") CALL dom%DEALLOCATE() CALL meshfile%DEALLOCATE() +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_1.md b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_1.md new file mode 100644 index 00000000..25f1bb0e --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_2.F90 new file mode 100644 index 00000000..43d46801 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_2.F90 @@ -0,0 +1,188 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_2.md b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_2.md new file mode 100644 index 00000000..cfcd0ff3 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_3.F90 b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_3.F90 new file mode 100644 index 00000000..236b6582 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_3.F90 @@ -0,0 +1,188 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() & + + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_4.F90 b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_4.F90 new file mode 100644 index 00000000..a545d59e --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalDOF_test_4.F90 @@ -0,0 +1,188 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() & + + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetTotalFaceDOF_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetTotalFaceDOF_test_1.F90 new file mode 100644 index 00000000..5da937b7 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalFaceDOF_test_1.F90 @@ -0,0 +1,130 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetTotalFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found, want + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalFaceDOF(globalFace=1, islocal=.TRUE.) + want = 0 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + + found = fedof%GetTotalFaceDOF(globalElement=1, islocal=.TRUE., & + localFaceNumber=1) + + CALL IS(found, want, testname//" interface 2 (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalFaceDOF(globalFace=1, islocal=.TRUE.) + want = 1 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + + found = fedof%GetTotalFaceDOF(globalElement=1, islocal=.TRUE., & + localFaceNumber=1) + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalFaceDOF(globalFace=1, islocal=.TRUE.) + want = 2 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + + found = fedof%GetTotalFaceDOF(globalElement=1, islocal=.TRUE., & + localFaceNumber=1) + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetTotalFaceDOF_test_1.md b/docs/docs-api/FEDOF/examples/_GetTotalFaceDOF_test_1.md new file mode 100644 index 00000000..367c4bbf --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetTotalFaceDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalFaceDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_1.F90 b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_1.F90 new file mode 100644 index 00000000..78de482e --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_1.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetVertexDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +use ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_1.md b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_1.md new file mode 100644 index 00000000..7d1735f5 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetVertexDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_2.F90 b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_2.F90 new file mode 100644 index 00000000..8987ee1d --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_2.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetVertexDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_2.md b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_2.md new file mode 100644 index 00000000..7beb0839 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_GetVertexDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetVertexDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEDOF/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/FEDOF/examples/_ImportFromToml_test_1.F90 index 2c558dde..5b37d1e3 100644 --- a/docs/docs-api/FEDOF/examples/_ImportFromToml_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_ImportFromToml_test_1.F90 @@ -17,8 +17,9 @@ PROGRAM main TYPE(FEDOF_) :: obj TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + toml_filename = "./toml/_ImportFromToml_test_1.toml" TYPE(HDF5File_) :: meshfile INTEGER(I4B) :: found, want @@ -29,52 +30,52 @@ PROGRAM main meshptr => dom%GetMeshPointer() -CALL obj%ImportFromToml(tomlName="test1", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test1", filename=toml_filename, & + dom=dom) !CALL fedof%Display("FEDOF:") found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() CALL IS(found, want, "Total DOF (order=1): ") -CALL obj%ImportFromToml(tomlName="test2", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test2", filename=toml_filename, & + dom=dom) found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() CALL IS(found, want, "Total DOF (order=2): ") -CALL obj%ImportFromToml(tomlName="test3", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test3", filename=toml_filename, & + dom=dom) found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() CALL IS(found, want, "Total DOF (order=3): ") -CALL obj%ImportFromToml(tomlName="test4", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test4", filename=toml_filename, & + dom=dom) found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() CALL OK(found == want, "Total DOF (order=4): ") -CALL obj%ImportFromToml(tomlName="test5", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test5", filename=toml_filename, & + dom=dom) !CALL fedof%Display("FEDOF:") found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() CALL IS(found, want, "Total DOF (order=1): ") -CALL obj%ImportFromToml(tomlName="test6", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test6", filename=toml_filename, & + dom=dom) found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() CALL IS(found, want, "Total DOF (order=2): ") -CALL obj%ImportFromToml(tomlName="test7", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test7", filename=toml_filename, & + dom=dom) found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() CALL IS(found, want, "Total DOF (order=3): ") -CALL obj%ImportFromToml(tomlName="test8", & - filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +CALL obj%ImportFromToml(tomlName="test8", filename=toml_filename, & + dom=dom) found = obj%GetTotalDOF() want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() CALL OK(found == want, "Total DOF (order=4): ") diff --git a/docs/docs-api/FEDOF/examples/_ImportFromToml_test_2.F90 b/docs/docs-api/FEDOF/examples/_ImportFromToml_test_2.F90 index 3d82b9a9..49e3d7f6 100644 --- a/docs/docs-api/FEDOF/examples/_ImportFromToml_test_2.F90 +++ b/docs/docs-api/FEDOF/examples/_ImportFromToml_test_2.F90 @@ -19,10 +19,11 @@ PROGRAM main TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() CHARACTER(*), PARAMETER :: filename = & - "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + toml_filename = "./toml/_ImportFromToml_test_2.toml" TYPE(HDF5File_) :: meshfile LOGICAL(LGT) :: isok -INTEGER(I4B) :: found, want, order, ii, iel +INTEGER(I4B) :: found, want CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") @@ -32,9 +33,7 @@ PROGRAM main meshptr => dom%GetMeshPointer() CALL fedof%ImportFromToml(tomlName="test1", & - filename="./toml/_ImportFromToml_test_2.toml", mesh=meshptr) - -! CALL fedof%DisplayCellOrder("Debug Cell order", full=.TRUE.) + filename=toml_filename, dom=dom) found = fedof%GetTotalDOF() want = 39 diff --git a/docs/docs-api/FEDOF/examples/_ImportFromToml_test_3.F90 b/docs/docs-api/FEDOF/examples/_ImportFromToml_test_3.F90 new file mode 100644 index 00000000..d6b19ac5 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_ImportFromToml_test_3.F90 @@ -0,0 +1,79 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate FEDOF object by import from toml + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5", & + toml_filename = "./toml/_ImportFromToml_test_1.toml" +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%ImportFromToml(tomlName="test1", filename=toml_filename, dom=dom) +!CALL fedof%Display("FEDOF:") +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL IS(found, want, "Total DOF (order=1): ") + +CALL obj%ImportFromToml(tomlName="test2", filename=toml_filename, dom=dom) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=2): ") + +CALL obj%ImportFromToml(tomlName="test3", filename=toml_filename, dom=dom) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=3): ") + +CALL obj%ImportFromToml(tomlName="test4", filename=toml_filename, dom=dom) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +CALL obj%ImportFromToml(tomlName="test5", filename=toml_filename, dom=dom) +!CALL fedof%Display("FEDOF:") +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL IS(found, want, "Total DOF (order=1): ") + +CALL obj%ImportFromToml(tomlName="test6", filename=toml_filename, dom=dom) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=2): ") + +CALL obj%ImportFromToml(tomlName="test7", filename=toml_filename, dom=dom) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=3): ") + +CALL obj%ImportFromToml(tomlName="test8", filename=toml_filename, dom=dom) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/FEDOF/examples/_Initiate_test_1.F90 b/docs/docs-api/FEDOF/examples/_Initiate_test_1.F90 index c8120380..70e141cb 100644 --- a/docs/docs-api/FEDOF/examples/_Initiate_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_Initiate_test_1.F90 @@ -1,3 +1,8 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-06 +! summary: Test the intitiate method for H1, Heirarchical basis, +! for different orders. + PROGRAM main USE FEDOF_Class USE FEDomain_Class @@ -14,7 +19,7 @@ PROGRAM main TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5" + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" TYPE(HDF5File_) :: meshfile INTEGER(I4B) :: found, want diff --git a/docs/docs-api/FEDOF/examples/_Initiate_test_2.F90 b/docs/docs-api/FEDOF/examples/_Initiate_test_2.F90 index 7ed3c42c..b7b3b2e7 100644 --- a/docs/docs-api/FEDOF/examples/_Initiate_test_2.F90 +++ b/docs/docs-api/FEDOF/examples/_Initiate_test_2.F90 @@ -18,45 +18,56 @@ PROGRAM main TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseInterpolation = "Hierarchical", & + baseContinuity = "H1" + TYPE(HDF5File_) :: meshfile INTEGER(I4B) :: found, want INTEGER(I4B), ALLOCATABLE :: cellOrder(:) -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') meshptr => dom%GetMeshPointer() +! CALL meshptr%DisplayMeshInfo("Mesh Info:") + CALL Reallocate(cellOrder, meshptr%GetTotalCells()) cellOrder = 1 -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=cellOrder, mesh=meshptr) -!CALL fedof%Display("FEDOF:") +CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=cellOrder, mesh=meshptr, islocal=.TRUE.) +! CALL fedof%Display("FEDOF:") found = fedof%GetTotalDOF() want = meshptr%GetTotalNodes() CALL IS(found, want, "Total DOF (order=1): ") cellOrder = 2 -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=cellOrder, mesh=meshptr) +CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=cellOrder, mesh=meshptr, islocal=.TRUE.) + found = fedof%GetTotalDOF() want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() CALL IS(found, want, "Total DOF (order=2): ") cellOrder = 3 -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=cellOrder, mesh=meshptr) +CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=cellOrder, mesh=meshptr, islocal=.TRUE.) + found = fedof%GetTotalDOF() want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + meshptr%GetTotalCells() CALL IS(found, want, "Total DOF (order=3): ") cellOrder = 4 -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=cellOrder, mesh=meshptr) +CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=cellOrder, mesh=meshptr, islocal=.TRUE.) found = fedof%GetTotalDOF() want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() CALL IS(found, want, "Total DOF (order=4): ") diff --git a/docs/docs-api/FEDOF/examples/_Initiate_test_3.F90 b/docs/docs-api/FEDOF/examples/_Initiate_test_3.F90 index 1a486add..d5155f29 100644 --- a/docs/docs-api/FEDOF/examples/_Initiate_test_3.F90 +++ b/docs/docs-api/FEDOF/examples/_Initiate_test_3.F90 @@ -1,5 +1,5 @@ !> author: Vikas Sharma, Ph. D. -! date: +! date: 2025-06-06 ! summary: Initiate fedof with H1 and Heirarchical bases, order is a vector. PROGRAM main @@ -18,8 +18,10 @@ PROGRAM main TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseInterpolation = "Hierarchical", & + baseContinuity = "H1" TYPE(HDF5File_) :: meshfile LOGICAL(LGT) :: isok INTEGER(I4B) :: found, want, order, ii, iel @@ -63,17 +65,15 @@ PROGRAM main cellOrder(ii) = order END DO -CALL fedof%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & - order=cellOrder, mesh=meshptr) +CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=cellOrder, mesh=meshptr, islocal=.TRUE.) found = fedof%GetTotalDOF() want = 39 isok = found == want CALL OK(isok, "Total DOF ") IF (.NOT. isok) CALL Display([found, want], "found, want: ") -CALL Display(fedof%GetConnectivity(globalElement=13, islocal=.FALSE., opt="A"), & - "connectivity of global element 13", full=.TRUE.) - CALL dom%DEALLOCATE() CALL meshfile%DEALLOCATE() diff --git a/docs/docs-api/FEDOF/examples/_Initiate_test_5.F90 b/docs/docs-api/FEDOF/examples/_Initiate_test_5.F90 index ae0b32f0..0a561c59 100644 --- a/docs/docs-api/FEDOF/examples/_Initiate_test_5.F90 +++ b/docs/docs-api/FEDOF/examples/_Initiate_test_5.F90 @@ -18,8 +18,8 @@ PROGRAM main TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../FEMesh/examples/meshdata/small_tri6_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5" TYPE(HDF5File_) :: meshfile INTEGER(I4B) :: found, want INTEGER(I4B), PARAMETER :: order = 2, ipType = poly%monomial @@ -35,8 +35,8 @@ PROGRAM main CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & baseInterpolation=baseInterpolation, & - order=order, & - mesh=meshptr) + order=order, mesh=meshptr) + !CALL fedof%Display("FEDOF:") found = fedof%GetTotalDOF() want = meshptr%GetTotalNodes() diff --git a/docs/docs-api/FEDOF/examples/_Initiate_test_6.F90 b/docs/docs-api/FEDOF/examples/_Initiate_test_6.F90 index 493fd8dc..1ea685c0 100644 --- a/docs/docs-api/FEDOF/examples/_Initiate_test_6.F90 +++ b/docs/docs-api/FEDOF/examples/_Initiate_test_6.F90 @@ -18,8 +18,8 @@ PROGRAM main TYPE(FEDOF_) :: fedof TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: meshptr => NULL() -CHARACTER(*), PARAMETER :: filename = & - "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" TYPE(HDF5File_) :: meshfile LOGICAL(LGT) :: isok INTEGER(I4B) :: found, want, order, ii, iel @@ -53,8 +53,8 @@ PROGRAM main CALL fedof%Initiate(baseContinuity=baseContinuity, & baseInterpolation=baseInterpolation, & - order=cellOrder, & - mesh=meshptr) + order=cellOrder, mesh=meshptr) + found = fedof%GetTotalDOF() want = 39 isok = found == want diff --git a/docs/docs-api/FEDOF/examples/_Lagrange_test_1.F90 b/docs/docs-api/FEDOF/examples/_Lagrange_test_1.F90 index 7b29e29b..71226b5f 100644 --- a/docs/docs-api/FEDOF/examples/_Lagrange_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_Lagrange_test_1.F90 @@ -1,4 +1,4 @@ -!> author: Vikas Sharma, Ph. D. +!f author: Vikas Sharma, Ph. D. ! date: 2024-05-24 ! summary: Lagrange polynomial is tested in this example @@ -11,7 +11,7 @@ PROGRAM main USE GlobalData USE Test_Method USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -use BaseType, only: poly=>TypePolynomialOpt +USE BaseType, ONLY: poly => TypePolynomialOpt IMPLICIT NONE @@ -22,8 +22,8 @@ PROGRAM main "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" TYPE(HDF5File_) :: meshfile -INTEGER(I4B) :: found, want -INTEGER(I4B), PARAMETER :: order = 2, ipType = poly%monomial +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 1, ipType = poly%monomial CHARACTER(*), PARAMETER :: baseContinuity = "H1" CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" @@ -35,14 +35,35 @@ PROGRAM main meshptr => dom%GetMeshPointer() CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & - baseInterpolation=baseInterpolation, order=order, mesh=meshptr) -CALL fedof%Display("FEDOF:") + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + found = fedof%GetTotalDOF() -want = meshptr%GetTotalNodes() -CALL IS(found, want, "Total DOF (order=2): ") + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") !CALL dom%Display("domain:") CALL dom%DEALLOCATE() CALL meshfile%DEALLOCATE() END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/FEDOF/examples/_Lagrange_test_2.F90 b/docs/docs-api/FEDOF/examples/_Lagrange_test_2.F90 new file mode 100644 index 00000000..559f4d53 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_Lagrange_test_2.F90 @@ -0,0 +1,69 @@ +!f author: Vikas Sharma, Ph. D. +! date: 2024-05-24 +! summary: Lagrange polynomial is tested in this example + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: poly => TypePolynomialOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 2, ipType = poly%monomial +CHARACTER(*), PARAMETER :: baseContinuity = "H1" +CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + +found = fedof%GetTotalDOF() + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/FEDOF/examples/_Lagrange_test_3.F90 b/docs/docs-api/FEDOF/examples/_Lagrange_test_3.F90 new file mode 100644 index 00000000..f3e98ad1 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_Lagrange_test_3.F90 @@ -0,0 +1,69 @@ +!f author: Vikas Sharma, Ph. D. +! date: 2024-05-24 +! summary: Lagrange polynomial is tested in this example + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: poly => TypePolynomialOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 3, ipType = poly%monomial +CHARACTER(*), PARAMETER :: baseContinuity = "H1" +CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + +found = fedof%GetTotalDOF() + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/FEDOF/examples/_Lagrange_test_4.F90 b/docs/docs-api/FEDOF/examples/_Lagrange_test_4.F90 new file mode 100644 index 00000000..f78f8855 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/_Lagrange_test_4.F90 @@ -0,0 +1,71 @@ +!f author: Vikas Sharma, Ph. D. +! date: 2024-05-24 +! summary: Lagrange polynomial is tested in this example +! I am checking the totalDOF for a fedof of order 4 on +! a linear mesh. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: poly => TypePolynomialOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 4, ipType = poly%monomial +CHARACTER(*), PARAMETER :: baseContinuity = "H1" +CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + +found = fedof%GetTotalDOF() + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/FEDOF/examples/_SetSparsity_test_1.F90 b/docs/docs-api/FEDOF/examples/_SetSparsity_test_1.F90 index 3e49a8df..1ce46a9b 100644 --- a/docs/docs-api/FEDOF/examples/_SetSparsity_test_1.F90 +++ b/docs/docs-api/FEDOF/examples/_SetSparsity_test_1.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-10 +! summary: Testing SetSparsity method of FEDOF class. + PROGRAM main USE FEDOF_Class USE FEMesh_Class @@ -6,7 +10,7 @@ PROGRAM main USE Display_Method USE GlobalData USE Test_Method -USE ExceptionHandler_Class +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION USE BaseType USE DOF_Method USE CSRMatrix_Method @@ -15,14 +19,15 @@ PROGRAM main IMPLICIT NONE CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/very_small_quad4_mesh.h5" + "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5" CHARACTER(*), PARAMETER :: baseContinuity = "H1", & - baseInterpolation = "Heirarchical" + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" SetSparsity " -INTEGER(I4B), PARAMETER :: order = 1, nsd = 2 +INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B) :: ii, jj +INTEGER(I4B) :: ii, jj, order TYPE(CSRMatrix_) :: mat TYPE(DOF_) :: dofobj @@ -32,60 +37,145 @@ PROGRAM main REAL(DFP), ALLOCATABLE :: found(:, :), want(:, :) LOGICAL(LGT) :: isok +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() - CALL mesh%Initiate(meshfile, dim=nsd) -CALL mesh%DisplayMeshInfo("mesh info:") +CALL test1 +CALL test2 + +!CALL mesh%Display("domain:") +CALL mesh%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=mesh) + + CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalDOF()], & + names=['K'], spaceCompo=[1], timeCompo=[1], & + storageFMT=NODES_FMT) + + CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & + idof=dofobj, jdof=dofobj) + + CALL obj%SetSparsity(mat=mat) + + !! setting all entries to 1.0 + mat = 1.0_DFP + + !! converting sparse matrix to dense matrix + !! for testing + found = mat + + ALLOCATE (want(9, 9)) + want = 0.0_DFP + + want(1, [1, 5, 7, 9]) = 1.0_DFP + want(2, [2, 5, 8, 9]) = 1.0_DFP + want(3, [3, 6, 7, 9]) = 1.0_DFP + want(4, [4, 6, 8, 9]) = 1.0_DFP + want(5, [5, 1, 2, 7, 8, 9]) = 1.0_DFP + want(6, [6, 3, 4, 7, 8, 9]) = 1.0_DFP + want(7, [7, 1, 3, 5, 6, 9]) = 1.0_DFP + want(8, [8, 2, 4, 5, 6, 9]) = 1.0_DFP + want(9, [9, 1, 2, 3, 4, 5, 6, 7, 8]) = 1.0_DFP + + do_jj: DO jj = 1, SIZE(want, 2) + DO ii = 1, SIZE(want, 1) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT do_jj + + END IF + END DO + END DO do_jj -CALL obj%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) + CALL OK(isok, testname//" test1") -CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalDOF()], & - names=['K'], spaceCompo=[1], timeCompo=[1], & - storageFMT=NODES_FMT) +END SUBROUTINE test1 -CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & - idof=dofobj, jdof=dofobj) +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- -CALL obj%SetSparsity(mat=mat) +SUBROUTINE test2 -mat = 1.0_DFP + order = 2 -found = mat + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=mesh) -ALLOCATE (want(9, 9)) -want = 0.0_DFP + CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalDOF()], & + names=['K'], spaceCompo=[1], timeCompo=[1], & + storageFMT=NODES_FMT) -want(1, [1, 5, 7, 9]) = 1.0_DFP -want(2, [2, 5, 8, 9]) = 1.0_DFP -want(3, [3, 6, 7, 9]) = 1.0_DFP -want(4, [4, 6, 8, 9]) = 1.0_DFP -want(5, [5, 1, 2, 7, 8, 9]) = 1.0_DFP -want(6, [6, 3, 4, 7, 8, 9]) = 1.0_DFP -want(7, [7, 1, 3, 5, 6, 9]) = 1.0_DFP -want(8, [8, 2, 4, 5, 6, 9]) = 1.0_DFP -want(9, [9, 1, 2, 3, 4, 5, 6, 7, 8]) = 1.0_DFP + CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & + idof=dofobj, jdof=dofobj) -do_jj: DO jj = 1, SIZE(want, 2) - DO ii = 1, SIZE(want, 1) + CALL obj%SetSparsity(mat=mat) + + mat = 1.0_DFP + + found = mat + + want = found + want = 0.0_DFP + + want(1, [1, 5, 7, 9, 10, 11, 12, 13, 22]) = 1.0_DFP + ii = 1 + DO jj = 1, SIZE(want, 2) isok = found(ii, jj) .EQ. want(ii, jj) IF (.NOT. isok) THEN CALL Display([ii, jj], "ii, jj: ") - EXIT do_jj + EXIT + END IF + END DO + + CALL OK(isok, testname//" test2") + want(5, [5, 1, 2, 7, 8, 9, 10, 11, 12, 13, 22, 17, 18, 19, 24]) = 1.0_DFP + ii = 5 + DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT END IF END DO -END DO do_jj + CALL OK(isok, testname//" test2") -CALL OK(isok, "CSRMatrix_Method: SetSparsity") + want(11, [11, 1, 2, 5, 7, 8, 9, 10, 12, 13, 22, 17, 18, 19, 24]) = 1.0_DFP + ii = 11 + DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT + END IF + END DO + CALL OK(isok, testname//" test2") -! CALL Display(mat, "sparse matrix:") +END SUBROUTINE test2 -!CALL mesh%Display("domain:") -CALL mesh%DEALLOCATE() -CALL meshfile%DEALLOCATE() +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- END PROGRAM main + +! mesh info: +! ============================== +! total nodes: 9 +! total elements: 4 +! tEdges: 0 +! tFaces: 12 diff --git a/docs/docs-api/FEDOF/examples/_SetSparsity_test_2.F90 b/docs/docs-api/FEDOF/examples/_SetSparsity_test_2.F90 index 76fc4229..2c75318b 100644 --- a/docs/docs-api/FEDOF/examples/_SetSparsity_test_2.F90 +++ b/docs/docs-api/FEDOF/examples/_SetSparsity_test_2.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-10 +! summary: This subroutine tests the SetSparsity method of the FEDOF class. + PROGRAM main USE FEDOF_Class USE FEMesh_Class @@ -15,7 +19,7 @@ PROGRAM main IMPLICIT NONE CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/very_small_quad4_mesh.h5" + "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5" CHARACTER(*), PARAMETER :: baseContinuity = "H1", & baseInterpolation = "Heirarchical" diff --git a/docs/docs-api/FEDOF/examples/toml/_ImportFromToml_test_3.toml b/docs/docs-api/FEDOF/examples/toml/_ImportFromToml_test_3.toml new file mode 100644 index 00000000..533de3a0 --- /dev/null +++ b/docs/docs-api/FEDOF/examples/toml/_ImportFromToml_test_3.toml @@ -0,0 +1,14 @@ +[test1] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[test1.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 + diff --git a/docs/docs-api/FEDOF/index.md b/docs/docs-api/FEDOF/index.md index a72a4541..6ffab69f 100644 --- a/docs/docs-api/FEDOF/index.md +++ b/docs/docs-api/FEDOF/index.md @@ -28,25 +28,15 @@ The basic steps of using this data type is given below. ### Constructor methods -There are several ways to initiate an instance of `FEDOF`. +Although, there are several ways to initiate an instance of `FEDOF`. The most common way is to call the [`Initiate`](./Initiate.md) method. ```fortran -CALL obj%Initiate(order, mesh, baseContinuity, baseInterpolation, ipType, basisType, alpha, beta, lambda) +CALL obj%Initiate(order, mesh, baseContinuity, baseInterpolation, ipType, basisType, alpha, beta, lambda, islocal) ``` -- Here `order` represents the order of each element. It can be a scalar, vector, or a two dimensional matrix of integers. [The method with scalar order is given here.](./Initiate.md#interface-1) - -:::tip Order is a vector -When `order` is a vector of integer then it represents the order of each cell element. [This method is discussed here](./Initiate.md#interface-2). In this case, the length of `order` must be equal to the number of elements in the mesh. -::: - -:::tip Order is a matrix -When order is a matrix of integer then the first row represents the global number of cell element, and the second row represents the order of cell element. [This method is given here](./Initiate.md#interface-4) -::: - -:::info -Read more about [Initiate](./Initiate.md) method. -::: +- Here `order` represents the order of each element. It can be a scalar, vector, or a two dimensional matrix of integers. [The method with scalar order is given here.](./Initiate.md) + - When `order` is a vector of integer then it represents the order of each cell element. In this case, the length of `order` must be equal to the number of elements in the mesh. + - When `order` is a matrix of integer then the first row represents the global number of cell element, and the second row represents the order of cell element. You can also initiate an instance of `FEDOF` using [ParameterList](/docs/docs-api/ParameterList/index.md). The process is given below. @@ -57,47 +47,60 @@ You can also initiate an instance of `FEDOF` using [ParameterList](/docs/docs-ap CALL obj%Initiate(param, mesh) ``` -### Get methods - -#### Get the upper bound for connectivity matrix - -```fortran -ans = obj%GetMaxTotalConnectivty() -``` - -#### Get order of cell element - -```fortran -CALL obj%GetCellOrder(cellOrder, tCellOrder) -``` - -#### Get quadrature points - -```fortran -CALL obj%GetQuadraturePoints(quad, globalElement, islocal, quadratureType, order) -``` - -#### Getting the shape data - -Getting the local element shape data. - -```fortran -CALL obj%GetLocalElemShapeData(globalElement, isLocal, quad, elemsd) -``` - -Getting the global element shape data. - -```fortran -CALL obj%GetGlobalElemShapeData(globalElement, isLocal, xij, elemsd) -``` +| Method | Description | +| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| [`Initiate`](./Initiate.md) | Initializes a FEDOF (Finite Element Degrees of Freedom) object with various options for element order specification | +| [`SetFEDOFParam`](./SetFEDOFParam.md) | Sets essential parameters for constructing a FEDOF object in a parameter list | +| [`Copy` / `ASSIGNMENT(=)`](./Copy.md) | Copies the contents of one FEDOF object to another | +| [`DEALLOCATE`](./Copy.md) | Deallocates all data and resources used by a FEDOF object | -#### Getting the connectivity +These constructor methods handle the creation, initialization, and cleanup of FEDOF objects, which represent the degrees of freedom for finite element calculations. -Getting the local element connectivity. +### Get methods -```fortran -CALL obj%GetConnectivity_(globalElement, isLocal, ans, tsize, opt) -``` +The following table provides an overview of all methods defined in the GetMethods submodule of the FEDOF_Class. + +| Method Name | Purpose | +| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| [`GetCaseName`](./GetCaseName.md) | Gets the case name of FEDOF (combines baseContinuity and baseInterpolation) | +| [`GetVertexDOF`](./GetVertexDOF.md) | Retrieves the degrees of freedom associated with a vertex/node | +| [`GetEdgeDOF`](./GetEdgeDOF.md) | Retrieves the degrees of freedom associated with an edge | +| [`GetTotalEdgeDOF`](./GetTotalEdgeDOF.md) | Returns the total number of degrees of freedom on an edge | +| [`GetFaceDOF`](./GetFaceDOF.md) | Retrieves the degrees of freedom associated with a face | +| [`GetTotalFaceDOF`](./GetTotalFaceDOF.md) | Returns the total number of degrees of freedom on a face | +| [`GetCellDOF`](./GetCellDOF.md) | Retrieves the degrees of freedom associated with a cell | +| [`GetTotalCellDOF`](./GetTotalCellDOF.md) | Returns the total number of degrees of freedom on a cell | +| [`GetTotalVertexDOF`](./GetTotalVertexDOF.md) | Returns the total number of vertex degrees of freedom | +| [`GetTotalDOF`](./GetTotalDOF.md) | Returns the total number of degrees of freedom (in the entire mesh, an element, or filtered by type) | +| [`GetConnectivity`](./GetConnectivity.md) | Returns the connectivity array for an element | +| [`GetConnectivity_`](./GetConnectivity_.md) | Internal method for writing connectivity information into a provided array | +| [`GetPrefix`](./GetPrefix.md) | Returns the prefix used for setting data ("FEDOF") | +| [`GetMeshPointer`](./GetMeshPointer.md) | Returns a pointer to the associated mesh object | +| [`GetBaseInterpolation`](./GetBaseInterpolation.md) | Returns the base interpolation type used | +| [`GetCellOrder`](./GetCellOrder.md) | Retrieves the polynomial order of a cell | +| [`GetOrders`](./GetOrders.md) | Gets the cell, face, and edge orders and their orientations | +| [`GetMaxTotalConnectivity`](./GetMaxTotalConnectivity.md) | Returns the maximum size of connectivity across all elements | +| [`GetQuadraturePoints`](./GetQuadraturePoints.md) | Creates quadrature points for numerical integration | +| [`GetLocalElemShapeData`](./GetLocalElemShapeData.md) | Retrieves local element shape functions data | +| [`GetGlobalElemShapeData`](./GetGlobalElemShapeData.md) | Maps local shape functions to the global coordinate system | + +### IO Methods + +| Method | Description | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| `Display` | Displays the content of a FEDOF object including configuration, mesh information, and allocation status | +| `DisplayCellOrder` | Displays information about the cell order array and its contents | +| [`ImportFromToml`](./ImportFromToml.md) | Imports FEDOF configuration from a TOML file or table | + +These IO methods provide functionality for: + +- Displaying the state and configuration of a FEDOF object for debugging and information purposes +- Reading configuration from standardized TOML format files or tables +- Visualizing specific aspects of the FEDOF configuration like cell orders + +## Setting sparsity + +The sparsity of the FEDOF object can be set using the [`SetSparsity`](./SetSparsity.md) method. This method allows you to define how the degrees of freedom are organized and accessed, which can optimize performance for specific applications. ## Methods diff --git a/docs/docs-api/FEDomain/FEDomain_.md b/docs/docs-api/FEDomain/FEDomain_.md index 67a51e02..ad0f28e4 100644 --- a/docs/docs-api/FEDomain/FEDomain_.md +++ b/docs/docs-api/FEDomain/FEDomain_.md @@ -7,58 +7,8 @@ sidebar_position: 2 The structure of FEDomain CLASS is given below. ```fortran -TYPE :: FEDomain_ +TYPE, EXTENDS(AbstractDomain_) :: FEDomain_ PRIVATE - LOGICAL(LGT), PUBLIC :: isInitiated = .FALSE. - !! flag - TYPE(String) :: engine - !! Engine used for generating the meshes - INTEGER(I4B) :: majorVersion = 0 - !! Major version - INTEGER(I4B) :: minorVersion = 0 - !! Minor version - REAL(DFP) :: version = 0.0_DFP - !! Version MajorVersion.MinorVersion - INTEGER(I4B) :: nsd = 0_I4B - !! number of spatial dimension - INTEGER(I4B), PUBLIC :: maxNptrs = 0 - !! Largest node number in the domain - INTEGER(I4B), PUBLIC :: minNptrs = 0 - !! Smallest node number in the domain - INTEGER(I4B) :: tNodes = 0 - !! Total number of nodes in the mesh - LOGICAL(I4B) :: isNodeNumberSparse = .FALSE. - !! True if node numbers are not continuous - INTEGER(I4B), PUBLIC :: maxElemNum = 0 - !! Largest element number in the domain - INTEGER(I4B), PUBLIC :: minElemNum = 0 - !! Smallest element number in the domain - LOGICAL(LGT) :: isElemNumberSparse = .FALSE. - !! True if element numbers are sparse - INTEGER(I4B) :: tEntitiesForNodes = 0 - !! Total number of entities required for reading nodes - INTEGER(I4B) :: tEntitiesForElements = 0 - !! Total number of entities required for reading elements - INTEGER(I4B) :: tElements(0:3) = [0, 0, 0, 0] - !! Total number of elements inside the domain - !! tElements( 0 ) = total number of point elements - !! tElements( 1 ) = total number of line elements - !! tElements( 2 ) = total number of surface elements - !! tElements( 3 ) = total number of volume/cell elements - INTEGER(I4B) :: tEntities(0:3) = [0, 0, 0, 0] - !! Total number of entities inside the domain - !! tEntities( 0 ) = total number of point mesh entities, mesh of Points - !! tEntities( 1 ) = total number of line mesh entities, mesh of Edge - !! tEntities( 2 ) = total number of surface mesh entities, mesh Boundary - !! tEntities( 3 ) = total number of volume mesh entities, Omega - REAL(DFP), ALLOCATABLE, PUBLIC :: nodeCoord(:, :) - !! Nodal coordinates in XiJ format - !! Number of rows are 3, and number of columns is total nodes - INTEGER(I4B), ALLOCATABLE, PUBLIC :: local_nptrs(:) - !! local_nptrs are required to access the nodeCoord - INTEGER(I4B), ALLOCATABLE, PUBLIC :: global_nptrs(:) - !! global nptrs - CLASS(AbstractMesh_), POINTER :: meshVolume => NULL() !! meshVolume list of meshes of volume entities CLASS(AbstractMesh_), POINTER :: meshSurface => NULL() @@ -67,9 +17,11 @@ TYPE :: FEDomain_ !! meshCurve list of meshes of curve entities CLASS(AbstractMesh_), POINTER :: meshPoint => NULL() !! meshPoint list of meshes of point entities - - TYPE(CSRSparsity_) :: meshMap - !! Sparse mesh data in CSR format + CLASS(AbstractMesh_), POINTER :: mesh => NULL() + !! mesh points to meshVolume for nsd = 3 + !! mesh points to meshSurface for nsd = 2 + !! mesh points to meshCurve for nsd = 1 + !! mesh points to meshPoint for nsd = 0 END TYPE FEDomain_ ``` diff --git a/docs/docs-api/FEDomain/examples/FEDomain.toml b/docs/docs-api/FEDomain/examples/FEDomain.toml new file mode 100644 index 00000000..4229582b --- /dev/null +++ b/docs/docs-api/FEDomain/examples/FEDomain.toml @@ -0,0 +1,2 @@ +[test1] +filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" diff --git a/docs/docs-api/FEDomain/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/FEDomain/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..3f29453b --- /dev/null +++ b/docs/docs-api/FEDomain/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,15 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-11 +! summary: This program tests the ImportFromToml method of FEDomain class + +PROGRAM main +USE FEDomain_Class +IMPLICIT NONE +TYPE(FEDomain_) :: dom + +CHARACTER(*), PARAMETER :: tomlfilename = "./FEDomain.toml" + +CALL dom%ImportFromToml(tomlName="test1", fileName=tomlfilename) +CALL dom%DisplayDomainInfo("Domain Info after ImportFromToml test1:") + +END PROGRAM main diff --git a/docs/docs-api/FEDomain/examples/_Initiate_test_1.F90 b/docs/docs-api/FEDomain/examples/_Initiate_test_1.F90 index f200ed31..7b1783cb 100644 --- a/docs/docs-api/FEDomain/examples/_Initiate_test_1.F90 +++ b/docs/docs-api/FEDomain/examples/_Initiate_test_1.F90 @@ -7,7 +7,7 @@ PROGRAM main TYPE(FEDomain_) :: dom TYPE(HDF5File_) :: meshfile CHARACTER(*), PARAMETER :: filename = & - & "../../Mesh/examples/meshdata/small_mesh.h5" + "../../Mesh/examples/meshdata/small_mesh.h5" CALL meshfile%Initiate(filename, mode="READ") CALL meshfile%OPEN() CALL dom%Initiate(meshfile, '') diff --git a/docs/docs-api/FEDomain/examples/runner.toml b/docs/docs-api/FEDomain/examples/runner.toml new file mode 100644 index 00000000..4ad335de --- /dev/null +++ b/docs/docs-api/FEDomain/examples/runner.toml @@ -0,0 +1,3 @@ +BuildDir = "/tmp/easifem-tests/FEDomain" +BuildType = "Debug" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/FEDomain/index.md b/docs/docs-api/FEDomain/index.md index f6fbebe4..b8f40d60 100644 --- a/docs/docs-api/FEDomain/index.md +++ b/docs/docs-api/FEDomain/index.md @@ -9,16 +9,15 @@ category: - Domain - Mesh tags: - - Domain - - Mesh + - domain + - mesh - easifemClasses --- # FEDomain - - `FEDomain` is a collection of the meshes. It represents the finite element computation domain. +It is a subclass of `AbstractDomain` and provides additional functionalities for handling finite element domains. ## All methods diff --git a/docs/docs-api/FEMesh/GetTotalNodes.md b/docs/docs-api/FEMesh/GetTotalNodes.md index c204d085..ee75470e 100644 --- a/docs/docs-api/FEMesh/GetTotalNodes.md +++ b/docs/docs-api/FEMesh/GetTotalNodes.md @@ -9,3 +9,21 @@ This method is inherited from the [AbstractMesh](../AbstractMesh/AbstractMesh_.m import EXAMPLE5 from "../AbstractMesh/GetTotalNodes.md"; + +## Example 1 + +import EXAMPLE15 from "./examples/_GetTotalNodes_test_1.md"; + + + +## Example 2 + +import EXAMPLE25 from "./examples/_GetTotalNodes_test_2.md"; + + + +## Example 3 + +import EXAMPLE35 from "./examples/_GetTotalNodes_test_3.md"; + + diff --git a/docs/docs-api/FEMesh/MeshUsedInExamples.md b/docs/docs-api/FEMesh/MeshUsedInExamples.md new file mode 100644 index 00000000..cb201aeb --- /dev/null +++ b/docs/docs-api/FEMesh/MeshUsedInExamples.md @@ -0,0 +1,38 @@ +--- +sidebar_position: 2 +--- + +# Meshes used in examples + +## Small Tri3 Mesh + +| filename | `small_tri3_mesh` | +| -------------- | ----------------- | +| total Nodes | 12 | +| Total Elements | 14 | +| Total Edges | NA | +| Total Faces | 25 | + +![Small Tri3 Mesh](/img/blog/small_tri3_mesh.svg) + +## Small Tri6 Mesh + +| filename | `small_tri6_mesh` | +| -------------- | ----------------- | +| total Nodes | 37 | +| Total Elements | 14 | +| Total Edges | NA | +| Total Faces | 25 | + +![Small Tri6 Mesh](/img/blog/small_tri6_mesh.svg) + +## Very Small Quad4 Mesh + +| filename | `very_small_quad4_mesh` | +| -------------- | ----------------------- | +| total Nodes | 37 | +| Total Elements | 14 | +| Total Edges | NA | +| Total Faces | 25 | + +![Small Tri6 Mesh](/img/blog/very_small_quad4_mesh.svg) diff --git a/docs/docs-api/FEMesh/SetSparsity.md b/docs/docs-api/FEMesh/SetSparsity.md index e95d840d..b22c0d20 100644 --- a/docs/docs-api/FEMesh/SetSparsity.md +++ b/docs/docs-api/FEMesh/SetSparsity.md @@ -9,3 +9,9 @@ This method is inherited from the [AbstractMesh](../AbstractMesh/AbstractMesh_.m import EXAMPLE5 from "../AbstractMesh/SetSparsity.md"; + +## Example 1 + +import EXAMPLE15 from "./examples/_SetSparsity_test_1.md"; + + diff --git a/docs/docs-api/FEMesh/examples/_GetTotalEntities_test_1.F90 b/docs/docs-api/FEMesh/examples/_GetTotalEntities_test_1.F90 index 1901b07d..c410b3aa 100644 --- a/docs/docs-api/FEMesh/examples/_GetTotalEntities_test_1.F90 +++ b/docs/docs-api/FEMesh/examples/_GetTotalEntities_test_1.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-05 +! summary: Test the `GetTotalEntities` method of `FEMesh_` class. + PROGRAM main USE FEMesh_Class, ONLY: FEMesh_ USE HDF5File_Class, ONLY: HDF5File_ @@ -10,7 +14,7 @@ PROGRAM main TYPE(FEMesh_) :: obj TYPE(HDF5File_) :: meshfile -CHARACTER(LEN=*), PARAMETER :: filename = "../../Mesh/examples/meshdata/small_quad4_mesh.h5" +CHARACTER(LEN=*), PARAMETER :: filename = "./meshdata/small_tri3_mesh.h5" INTEGER(I4B), PARAMETER :: nsd = 2 INTEGER(I4B) :: ans(4) LOGICAL(LGT) :: isok @@ -46,13 +50,13 @@ PROGRAM main ans = obj%GetTotalEntities(globalElement=1, islocal=.TRUE.) CALL Display("Total entities in local element 1:") -isok = ans(1) .EQ. 4 +isok = ans(1) .EQ. 3 CALL OK(isok, "Total nodes: ") isok = ans(2) .EQ. 0 CALL OK(isok, "Total edges: ") -isok = ans(3) .EQ. 4 +isok = ans(3) .EQ. 3 CALL OK(isok, "Total faces: ") isok = ans(4) .EQ. 1 @@ -67,7 +71,3 @@ PROGRAM main CALL obj%DEALLOCATE() END PROGRAM main -! total nodes = 25 -! total elements = 16 -! total faces = 40 -! total edges = 0 diff --git a/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_1.F90 b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_1.F90 index 70b4536e..613f7ee8 100644 --- a/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_1.F90 +++ b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_1.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-05 +! summary: Test for `GetTotalNodes` method of `FEMesh_` class. + PROGRAM main USE FEMesh_Class, ONLY: FEMesh_ USE HDF5File_Class, ONLY: HDF5File_ @@ -10,7 +14,7 @@ PROGRAM main TYPE(FEMesh_) :: obj TYPE(HDF5File_) :: meshfile -CHARACTER(LEN=*), PARAMETER :: filename = "../../Mesh/examples/meshdata/small_quad4_mesh.h5" +CHARACTER(LEN=*), PARAMETER :: filename = "./meshdata/very_small_quad4_mesh.h5" INTEGER(I4B), PARAMETER :: nsd = 2 INTEGER(I4B) :: found(8), want(8) LOGICAL(LGT) :: isok @@ -18,17 +22,21 @@ PROGRAM main ! Initiate and open the mesh file which is in `HDF5File_` format. CALL meshfile%Initiate(FileName=filename, MODE="READ") + ! Open the mesh file CALL meshfile%OPEN() + ! Initiate an instance of `Mesh_` CALL obj%Initiate(hdf5=meshfile, dim=nsd) +CALL obj%DisplayMeshInfo("Mesh Info") + CALL meshfile%DEALLOCATE() found(1) = obj%GetTotalNodes() found(2) = obj%GetTotalNodes(meshid=1) -want(1) = 25 -want(2) = 25 +want(1) = 9 +want(2) = 9 isok = found(1) .EQ. want(1) CALL ok(isok, testname) @@ -39,7 +47,10 @@ PROGRAM main CALL obj%DEALLOCATE() END PROGRAM main -! total nodes = 25 -! total elements = 16 -! total faces = 40 -! total edges = 0 +! Mesh Info +! ============================== +! total nodes: 9 +! total elements: 4 +! tEdges: 0 +! tFaces: 12 +! ============================== diff --git a/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_1.md b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_1.md new file mode 100644 index 00000000..3467fd37 --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_1.md @@ -0,0 +1,4 @@ +import CodeBlock from '@theme/CodeBlock'; +import MyCode from '!!raw-loader!./_GetTotalNodes_test_1.F90'; + +{MyCode} diff --git a/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_2.F90 b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_2.F90 new file mode 100644 index 00000000..7b816d34 --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_2.F90 @@ -0,0 +1,56 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-05 +! summary: Test for `GetTotalNodes` method of `FEMesh_` class. + +PROGRAM main +USE FEMesh_Class, ONLY: FEMesh_ +USE HDF5File_Class, ONLY: HDF5File_ +USE GlobalData, ONLY: I4B, LGT, Quadrangle +USE ReallocateUtility, ONLY: Reallocate +USE Display_Method, ONLY: Display +USE Test_Method + +IMPLICIT NONE + +TYPE(FEMesh_) :: obj +TYPE(HDF5File_) :: meshfile +CHARACTER(LEN=*), PARAMETER :: filename = "./meshdata/small_tri3_mesh.h5" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B) :: found(8), want(8) +LOGICAL(LGT) :: isok +CHARACTER(*), PARAMETER :: testname = "GetTotalNodes" + +! Initiate and open the mesh file which is in `HDF5File_` format. +CALL meshfile%Initiate(FileName=filename, MODE="READ") + +! Open the mesh file +CALL meshfile%OPEN() + +! Initiate an instance of `Mesh_` +CALL obj%Initiate(hdf5=meshfile, dim=nsd) +CALL obj%DisplayMeshInfo("Mesh Info") + +CALL meshfile%DEALLOCATE() + +found(1) = obj%GetTotalNodes() +found(2) = obj%GetTotalNodes(meshid=1) + +want(1) = 12 +want(2) = 12 + +isok = found(1) .EQ. want(1) +CALL ok(isok, testname) + +isok = found(2) .EQ. want(2) +CALL ok(isok, testname) + +CALL obj%DEALLOCATE() +END PROGRAM main + +! Mesh Info +! ============================== +! total nodes: 12 +! total elements: 14 +! tEdges: 0 +! tFaces: 25 +! ============================== diff --git a/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_2.md b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_2.md new file mode 100644 index 00000000..d47c20ef --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_2.md @@ -0,0 +1,4 @@ +import CodeBlock from '@theme/CodeBlock'; +import MyCode from '!!raw-loader!./_GetTotalNodes_test_2.F90'; + +{MyCode} diff --git a/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_3.F90 b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_3.F90 new file mode 100644 index 00000000..a698fe98 --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_3.F90 @@ -0,0 +1,56 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-05 +! summary: Test for `GetTotalNodes` method of `FEMesh_` class. + +PROGRAM main +USE FEMesh_Class, ONLY: FEMesh_ +USE HDF5File_Class, ONLY: HDF5File_ +USE GlobalData, ONLY: I4B, LGT, Quadrangle +USE ReallocateUtility, ONLY: Reallocate +USE Display_Method, ONLY: Display +USE Test_Method + +IMPLICIT NONE + +TYPE(FEMesh_) :: obj +TYPE(HDF5File_) :: meshfile +CHARACTER(LEN=*), PARAMETER :: filename = "./meshdata/small_tri6_mesh.h5" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B) :: found(8), want(8) +LOGICAL(LGT) :: isok +CHARACTER(*), PARAMETER :: testname = "GetTotalNodes" + +! Initiate and open the mesh file which is in `HDF5File_` format. +CALL meshfile%Initiate(FileName=filename, MODE="READ") + +! Open the mesh file +CALL meshfile%OPEN() + +! Initiate an instance of `Mesh_` +CALL obj%Initiate(hdf5=meshfile, dim=nsd) +CALL obj%DisplayMeshInfo("Mesh Info") + +CALL meshfile%DEALLOCATE() + +found(1) = obj%GetTotalNodes() +found(2) = obj%GetTotalNodes(meshid=1) + +want(1) = 37 +want(2) = 37 + +isok = found(1) .EQ. want(1) +CALL ok(isok, testname) + +isok = found(2) .EQ. want(2) +CALL ok(isok, testname) + +CALL obj%DEALLOCATE() +END PROGRAM main + +! Mesh Info +! ============================== +! total nodes: 37 +! total elements: 14 +! tEdges: 0 +! tFaces: 25 +! ============================== diff --git a/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_3.md b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_3.md new file mode 100644 index 00000000..35f3a893 --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_GetTotalNodes_test_3.md @@ -0,0 +1,4 @@ +import CodeBlock from '@theme/CodeBlock'; +import MyCode from '!!raw-loader!./_GetTotalNodes_test_3.F90'; + +{MyCode} diff --git a/docs/docs-api/FEMesh/examples/_GetTotalVertexNodes_test_1.F90 b/docs/docs-api/FEMesh/examples/_GetTotalVertexNodes_test_1.F90 new file mode 100644 index 00000000..f953b252 --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_GetTotalVertexNodes_test_1.F90 @@ -0,0 +1,56 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-05 +! summary: Test for `GetTotalVertexNodes` method of `FEMesh_` class. + +PROGRAM main +USE FEMesh_Class, ONLY: FEMesh_ +USE HDF5File_Class, ONLY: HDF5File_ +USE GlobalData, ONLY: I4B, LGT, Quadrangle +USE ReallocateUtility, ONLY: Reallocate +USE Display_Method, ONLY: Display +USE Test_Method + +IMPLICIT NONE + +TYPE(FEMesh_) :: obj +TYPE(HDF5File_) :: meshfile +CHARACTER(LEN=*), PARAMETER :: filename = "./meshdata/small_tri3_mesh.h5" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B) :: found(8), want(8) +LOGICAL(LGT) :: isok +CHARACTER(*), PARAMETER :: testname = "GetTotalVertexNodes" + +! Initiate and open the mesh file which is in `HDF5File_` format. +CALL meshfile%Initiate(FileName=filename, MODE="READ") + +! Open the mesh file +CALL meshfile%OPEN() + +! Initiate an instance of `Mesh_` +CALL obj%Initiate(hdf5=meshfile, dim=nsd) +CALL obj%DisplayMeshInfo("Mesh Info") + +CALL meshfile%DEALLOCATE() + +found(1) = obj%GetTotalVertexNodes() +want(1) = 12 + +found(2) = obj%GetTotalVertexNodes(meshid=1) +want(2) = 12 + +isok = found(1) .EQ. want(1) +CALL ok(isok, testname) + +isok = found(2) .EQ. want(2) +CALL ok(isok, testname) + +CALL obj%DEALLOCATE() +END PROGRAM main + +! Mesh Info +! ============================== +! total nodes: 12 +! total elements: 14 +! tEdges: 0 +! tFaces: 25 +! ============================== diff --git a/docs/docs-api/FEMesh/examples/_GetTotalVertexNodes_test_2.F90 b/docs/docs-api/FEMesh/examples/_GetTotalVertexNodes_test_2.F90 new file mode 100644 index 00000000..827c0f0b --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_GetTotalVertexNodes_test_2.F90 @@ -0,0 +1,56 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-05 +! summary: Test for `GetTotalVertexNodes` method of `FEMesh_` class. + +PROGRAM main +USE FEMesh_Class, ONLY: FEMesh_ +USE HDF5File_Class, ONLY: HDF5File_ +USE GlobalData, ONLY: I4B, LGT, Quadrangle +USE ReallocateUtility, ONLY: Reallocate +USE Display_Method, ONLY: Display +USE Test_Method + +IMPLICIT NONE + +TYPE(FEMesh_) :: obj +TYPE(HDF5File_) :: meshfile +CHARACTER(LEN=*), PARAMETER :: filename = "./meshdata/small_tri6_mesh.h5" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B) :: found(8), want(8) +LOGICAL(LGT) :: isok +CHARACTER(*), PARAMETER :: testname = "GetTotalVertexNodes" + +! Initiate and open the mesh file which is in `HDF5File_` format. +CALL meshfile%Initiate(FileName=filename, MODE="READ") + +! Open the mesh file +CALL meshfile%OPEN() + +! Initiate an instance of `Mesh_` +CALL obj%Initiate(hdf5=meshfile, dim=nsd) +CALL obj%DisplayMeshInfo("Mesh Info") + +CALL meshfile%DEALLOCATE() + +found(1) = obj%GetTotalVertexNodes() +want(1) = 12 + +found(2) = obj%GetTotalVertexNodes(meshid=1) +want(2) = 12 + +isok = found(1) .EQ. want(1) +CALL ok(isok, testname) + +isok = found(2) .EQ. want(2) +CALL ok(isok, testname) + +CALL obj%DEALLOCATE() +END PROGRAM main + +! Mesh Info +! ============================== +! total nodes: 12 +! total elements: 14 +! tEdges: 0 +! tFaces: 25 +! ============================== diff --git a/docs/docs-api/FEMesh/examples/_SetSparsity_test_1.F90 b/docs/docs-api/FEMesh/examples/_SetSparsity_test_1.F90 index 260a456b..0dc1b17c 100644 --- a/docs/docs-api/FEMesh/examples/_SetSparsity_test_1.F90 +++ b/docs/docs-api/FEMesh/examples/_SetSparsity_test_1.F90 @@ -1,15 +1,29 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-05 +! summary: Test for SetSparsity method of FEMesh class + PROGRAM main -USE easifemBase -USE easifemClasses +USE GlobalData +USE FEMesh_Class +USE HDF5File_Class +USE BaseType, ONLY: DOF_, CSRMatrix_ +USE DOF_Method +USE CSRMatrix_Method IMPLICIT NONE TYPE(FEMesh_) :: obj TYPE(HDF5File_) :: meshfile TYPE(DOF_) :: dofobj TYPE(CSRMatrix_) :: mat +INTEGER(I4B) :: tNodes(1) + +INTEGER(I4B), PARAMETER :: spaceCompo(1) = [1], & + timeCompo(1) = [1], & + storageFMT = NODES_FMT +CHARACTER(1), PARAMETER :: names(1) = ["K"] CHARACTER(LEN=*), PARAMETER :: filename = & - & "../../Mesh/examples/meshdata/small_mesh.h5" + "./meshdata/small_tri3_mesh.h5" CALL meshfile%Initiate(FileName=filename, MODE="READ") @@ -17,14 +31,15 @@ PROGRAM main CALL obj%Initiate(hdf5=meshfile, dim=2) -CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalNodes()], names=['K'], & - & spaceCompo=[1], timeCompo=[1], storageFMT=NODES_FMT) +tNodes = obj%GetTotalNodes() +CALL Initiate(obj=dofobj, tNodes=tNodes, & + spaceCompo=spaceCompo, timeCompo=timeCompo, & + names=names, storageFMT=storageFMT) CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & idof=dofobj, jdof=dofobj) -CALL obj%SetSparsity(mat=mat, localNodeNumber=obj%local_Nptrs, & - lbound=1, ubound=obj%GetMaxNodeNumber()) +CALL obj%SetSparsity(mat=mat) CALL obj%DEALLOCATE() CALL meshfile%DEALLOCATE() diff --git a/docs/docs-api/FEMesh/examples/_SetSparsity_test_1.md b/docs/docs-api/FEMesh/examples/_SetSparsity_test_1.md new file mode 100644 index 00000000..f4a0ce0a --- /dev/null +++ b/docs/docs-api/FEMesh/examples/_SetSparsity_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_SetSparsity_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_1.F90 b/docs/docs-api/FEVariable/examples/_Multiplication_test_1.F90 new file mode 100644 index 00000000..dfaf2fa5 --- /dev/null +++ b/docs/docs-api/FEVariable/examples/_Multiplication_test_1.F90 @@ -0,0 +1,488 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-28 +! This example tests multiplication (*) operator. Scalar nodal variable + +PROGRAM main +USE BaseType +USE FEVariable_Method +USE GlobalData +USE Display_Method +USE Test_Method + +IMPLICIT NONE + +CALL test1 +CALL test2 +CALL test3 +CALL test4 +CALL test5 +CALL test6 +CALL test7 +CALL test8 +CALL test9 +CALL test10 +CALL test11 +CALL test12 +CALL test13 +CALL test14 + +CONTAINS + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + TYPE(FEVariable_) :: obj1, obj2, ans, want + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test1: scalar scalar constant constant" + + obj1 = NodalVariable(1.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + obj2 = NodalVariable(2.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + ans = NodalVariable(0.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + want = NodalVariable(2.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + TYPE(FEVariable_) :: obj1, obj2, ans, want + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test2: scalar scalar constant space" + + obj1 = NodalVariable(1.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + obj2 = NodalVariable([2.0_DFP], TypeFEVariableScalar, TypeFEVariableSpace) + ans = NodalVariable(1, TypeFEVariableScalar, TypeFEVariableSpace) + want = NodalVariable([2.0_DFP], TypeFEVariableScalar, TypeFEVariableSpace) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + TYPE(FEVariable_) :: obj1, obj2, ans, want + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test3: scalar scalar constant time" + + obj1 = NodalVariable(1.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + obj2 = NodalVariable([2.0_DFP], TypeFEVariableScalar, TypeFEVariableTime) + ans = NodalVariable(1, TypeFEVariableScalar, TypeFEVariableTime) + want = NodalVariable([2.0_DFP], TypeFEVariableScalar, TypeFEVariableTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val2(2, 2), val1 + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test4: scalar scalar constant spacetime" + + val1 = 2.0_DFP + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableConstant) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + nrow=SIZE(val2, 1), ncol=SIZE(val2, 2), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpaceTime) + + want = NodalVariable( & + val1 * val2, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test5 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val2, val1(2) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test5: scalar scalar space constant" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableSpace) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableConstant) + + ans = NodalVariable( & + tsize=SIZE(val1), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpace) + + want = NodalVariable( & + val1 * val2, TypeFEVariableScalar, TypeFEVariableSpace) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test5 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test6 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val2(2), val1(2) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test6: scalar scalar space space" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableSpace) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableSpace) + + ans = NodalVariable( & + tsize=SIZE(val1), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpace) + + want = NodalVariable( & + val1 * val2, TypeFEVariableScalar, TypeFEVariableSpace) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test6 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test7 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2), val2(2, 3), wantVal(2, 3) + INTEGER(I4B) :: ii + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test7: scalar scalar space spacetime" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableSpace) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + nrow=SIZE(val2, 1), ncol=SIZE(val2, 2), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpaceTime) + + DO ii = 1, SIZE(val2, 2) + wantVal(:, ii) = val1 * val2(:, ii) + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test7 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test8 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2), val2, wantVal(2) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test8: scalar scalar time constant" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableConstant) + + ans = NodalVariable( & + tsize=SIZE(val1, 1), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableTime) + + wantVal = val1 * val2 + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test8 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test9 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2), val2(2), wantVal(2) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test9: scalar scalar time time" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableTime) + + ans = NodalVariable( & + tsize=SIZE(val1, 1), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableTime) + + wantVal = val1 * val2 + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test9 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test10 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(3), val2(2, 3), wantVal(2, 3) + INTEGER(I4B) :: ii + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test10: scalar scalar time spacetime" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + nrow=SIZE(val2, 1), & + ncol=SIZE(val2, 2), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpaceTime) + + DO ii = 1, SIZE(val2, 2) + wantVal(:, ii) = val1(ii) * val2(:, ii) + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test10 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test11 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2, wantVal(2, 3) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test11: scalar scalar spacetime constant" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableConstant) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpaceTime) + + wantVal = val1 * val2 + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test11 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test12 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2(2), wantVal(2, 3) + INTEGER(I4B) :: ii + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test12: scalar scalar spacetime space" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableSpace) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpaceTime) + + DO ii = 1, SIZE(val1, 2) + wantVal(:, ii) = val1(:, ii) * val2(:) + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test12 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test13 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2(3), wantVal(2, 3) + INTEGER(I4B) :: ii + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test13: scalar scalar spacetime time" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableTime) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpaceTime) + + DO ii = 1, SIZE(val1, 2) + wantVal(:, ii) = val1(:, ii) * val2(ii) + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test13 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test14 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2(2, 3), wantVal(2, 3) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test14: scalar scalar spacetime spacetime" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpaceTime) + + wantVal = val1 * val2 + + want = NodalVariable( & + wantVal, TypeFEVariableScalar, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test14 + +END PROGRAM main diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_1.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_1.md index 2d10faeb..6ae63347 100644 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_1.md +++ b/docs/docs-api/FEVariable/examples/_Multiplication_test_1.md @@ -1,106 +1,7 @@ -This example tests multiplication (*) operator. Scalar nodal variable +This example demonstrates the multiplication of two Scalar FEVariables. The variables `obj1`, `obj2` can be `constant`, `space`, `time`, or `spaceTime`. The `varType` of ans depends on the `varType` of `obj1` and `obj2`. -## Use association +import CodeBlock from '@theme/CodeBlock'; -- [[FEVariable_]] +import CodeSnippet from '!!raw-loader!./_Multiplication_test_1.F90'; -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * constant" - -```fortran -obj = NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "constant * constant") -``` - -```fortran -obj = NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * 1.0_DFP -CALL Display(obj, "constant * constant") -``` - -!!! note "space * constant" - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) & - * NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "space * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) & - * 1.0_DFP -CALL Display(obj, "space * constant") -``` - -!!! note "time * constant" - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) & - * NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "time * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) & - * 1.0_DFP -CALL Display(obj, "time * constant") -``` - -!!! note "spacetime * constant" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) & - * NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "spacetime * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) & - * 1.0_DFP -CALL Display(obj, "spacetime * constant") -``` - -```fortran -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_10.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_10.md deleted file mode 100644 index 58f66754..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_10.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: FEVariable example 33b -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- - -# FEVariable example 33b - -!!! note "" -This example tests * operator. Matrix, Nodal - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * space" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) -CALL Display(obj, "constant * space") -``` - -!!! note "space * space" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) & - * NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) -CALL Display(obj, "space * space") -``` - -!!! note "constant * time" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) -CALL Display(obj, "constant * time") -``` - -!!! note "time * time" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) & - * NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) -CALL Display(obj, "time * time") -``` - -!!! note "constant * spacetime" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "constant * spacetime") -``` - -!!! note "spacetime * spacetime" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) & - * NodalVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "spacetime * spacetime") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_11.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_11.md deleted file mode 100644 index 2fbbdedb..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_11.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: FEVariable example 33c -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/QuadratureVariable - - FEVariable/Display ---- - -# FEVariable example 33c - -!!! note "" -This example tests * operator. Matrix, Nodal - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * constant" - -```fortran -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "constant * constant") -``` - -```fortran -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * 1.0_DFP -CALL Display(obj, "constant * constant") -``` - -!!! note "space * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "space * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) & - * 1.0_DFP -CALL Display(obj, "space * constant") -``` - -!!! note "time * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "time * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) & - * 1.0_DFP -CALL Display(obj, "time * constant") -``` - -!!! note "spacetime * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "spacetime * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) & - * 1.0_DFP -CALL Display(obj, "spacetime * constant") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_12.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_12.md deleted file mode 100644 index e19b9232..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_12.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: FEVariable example 33d -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- - -# FEVariable example 33d - -!!! note "" -This example tests * operator. Matrix, Quadrature - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * space" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) -CALL Display(obj, "constant * space") -``` - -!!! note "space * space" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) -CALL Display(obj, "space * space") -``` - -!!! note "constant * time" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) -CALL Display(obj, "constant * time") -``` - -!!! note "time * time" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP),[3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) -CALL Display(obj, "time * time") -``` - -!!! note "constant * spacetime" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "constant * spacetime") -``` - -!!! note "spacetime * spacetime" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "spacetime * spacetime") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_2.F90 b/docs/docs-api/FEVariable/examples/_Multiplication_test_2.F90 new file mode 100644 index 00000000..286de529 --- /dev/null +++ b/docs/docs-api/FEVariable/examples/_Multiplication_test_2.F90 @@ -0,0 +1,570 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-28 +! This example tests multiplication (*) operator. +! obj1 is vector +! obj2 is vector + +PROGRAM main +USE BaseType +USE FEVariable_Method +USE GlobalData +USE Display_Method +USE Test_Method + +IMPLICIT NONE + +CALL test1 +CALL test2 +CALL test3 +CALL test4 +CALL test5 +CALL test6 +CALL test7 +CALL test8 +CALL test9 +CALL test10 +CALL test11 +CALL test12 +CALL test13 +CALL test14 + +CONTAINS + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + TYPE(FEVariable_) :: obj1, obj2, ans, want + LOGICAL(LGT) :: isok + REAL(DFP) :: val1(2), val2(2), wantVal(2) + + CHARACTER(*), PARAMETER :: testName = & + "test1: vector vector constant constant" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableConstant) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableConstant) + + ans = NodalVariable( & + tsize=SIZE(val1), & + rank=TypeFEVariableVector, & + varType=TypeFEVariableConstant) + + wantVal = val1 * val2 + want = NodalVariable(wantVal, TypeFEVariableVector, TypeFEVariableConstant) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2), val2(2, 3), wantVal(2, 3) + INTEGER(I4B) :: ii + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test2: Vector Vector constant space" + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableConstant) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableSpace) + + ans = NodalVariable( & + nrow=SIZE(val2, 1), & + ncol=SIZE(val2, 2), & + rank=TypeFEVariableVector, & + varType=TypeFEVariableSpace) + + DO ii = 1, SIZE(val2, 2) + wantVal(:, ii) = val1 * val2(:, ii) + END DO + + want = NodalVariable(wantVal, TypeFEVariableVector, TypeFEVariableSpace) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + TYPE(FEVariable_) :: obj1, obj2, ans, want + LOGICAL(LGT) :: isok + REAL(DFP) :: val1(2), val2(2, 3), wantVal(2, 3) + INTEGER(I4B) :: ii + CHARACTER(*), PARAMETER :: testName = & + "test3: Vector Vector constant time" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableConstant) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableTime) + + ans = NodalVariable( & + nrow=SIZE(val2, 1), & + ncol=SIZE(val2, 2), & + rank=TypeFEVariableVector, & + varType=TypeFEVariableTime) + + DO ii = 1, SIZE(val2, 2) + wantVal(:, ii) = val1 * val2(:, ii) + END DO + + want = NodalVariable(wantVal, TypeFEVariableVector, TypeFEVariableTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2), val2(2, 3, 4), wantVal(2, 3, 4) + INTEGER(I4B) :: ii, jj + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test4: Vector Vector constant spacetime" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableConstant) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + dim1=SIZE(val2, 1), & + dim2=SIZE(val2, 2), & + dim3=SIZE(val2, 3), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpaceTime) + + DO jj = 1, SIZE(val2, 3) + DO ii = 1, SIZE(val2, 2) + wantVal(:, ii, jj) = val1 * val2(:, ii, jj) + END DO + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test5 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2(2), wantVal(2, 3) + INTEGER(I4B) :: ii + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test5: Vector Vector space constant" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableSpace) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableConstant) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpace) + + DO ii = 1, SIZE(val1, 2) + wantVal(:, ii) = val1(:, ii) * val2(:) + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpace) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test5 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test6 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val2(2, 3), val1(2, 3), wantVal(2, 3) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test6: Vector Vector space space" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableSpace) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableSpace) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpace) + + wantVal = val1 * val2 + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpace) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test6 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test7 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2(2, 3, 4), wantVal(2, 3, 4) + INTEGER(I4B) :: ii, jj + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test7: Vector Vector space spacetime" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableSpace) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + dim1=SIZE(val2, 1), & + dim2=SIZE(val2, 2), & + dim3=SIZE(val2, 3), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpaceTime) + + DO jj = 1, SIZE(val2, 3) + DO ii = 1, SIZE(val2, 2) + wantVal(:, ii, jj) = val1(:, ii) * val2(:, ii, jj) + END DO + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test7 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test8 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2(2), wantVal(2, 3) + INTEGER(I4B) :: ii + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test8: Vector Vector time constant" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableConstant) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableTime) + + DO ii = 1, SIZE(val1, 2) + wantVal(:, ii) = val1(:, ii) * val2(:) + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableTime) + + CALL Multiplication_(obj1, obj2, ans) + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test8 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test9 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3), val2(2, 3), wantVal(2, 3) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test9: Vector Vector time time" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableTime) + + ans = NodalVariable( & + nrow=SIZE(val1, 1), & + ncol=SIZE(val1, 2), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableTime) + + wantVal = val1 * val2 + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test9 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test10 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 4), val2(2, 3, 4), wantVal(2, 3, 4) + INTEGER(I4B) :: ii, jj + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test10: Vector Vector time spacetime" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + dim1=SIZE(val2, 1), & + dim2=SIZE(val2, 2), & + dim3=SIZE(val2, 3), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpaceTime) + + DO jj = 1, SIZE(val2, 3) + DO ii = 1, SIZE(val2, 2) + wantVal(:, ii, jj) = val1(:, jj) * val2(:, ii, jj) + END DO + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test10 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test11 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3, 4), val2(2), wantVal(2, 3, 4) + LOGICAL(LGT) :: isok + INTEGER(I4B) :: ii, jj + + CHARACTER(*), PARAMETER :: testName = & + "test11: Vector Vector spacetime constant" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableConstant) + + ans = NodalVariable( & + dim1=SIZE(val1, 1), & + dim2=SIZE(val1, 2), & + dim3=SIZE(val1, 3), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpaceTime) + + DO jj = 1, SIZE(val1, 3) + DO ii = 1, SIZE(val1, 2) + wantVal(:, ii, jj) = val1(:, ii, jj) * val2(:) + END DO + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test11 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test12 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3, 4), val2(2, 3), wantVal(2, 3, 4) + INTEGER(I4B) :: ii, jj + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test12: Vector Vector spacetime space" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableSpace) + + ans = NodalVariable( & + dim1=SIZE(val1, 1), & + dim2=SIZE(val1, 2), & + dim3=SIZE(val1, 3), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpaceTime) + + DO jj = 1, SIZE(val1, 3) + DO ii = 1, SIZE(val1, 2) + wantVal(:, ii, jj) = val1(:, ii, jj) * val2(:, ii) + END DO + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test12 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test13 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3, 4), val2(2, 4), wantVal(2, 3, 4) + INTEGER(I4B) :: ii, jj + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test13: Vector Vector spacetime time" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableTime) + + ans = NodalVariable( & + dim1=SIZE(val1, 1), & + dim2=SIZE(val1, 2), & + dim3=SIZE(val1, 3), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpaceTime) + + DO jj = 1, SIZE(val1, 3) + DO ii = 1, SIZE(val1, 2) + wantVal(:, ii, jj) = val1(:, ii, jj) * val2(:, jj) + END DO + END DO + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test13 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test14 + TYPE(FEVariable_) :: obj1, obj2, ans, want + REAL(DFP) :: val1(2, 3, 4), val2(2, 3, 4), wantVal(2, 3, 4) + LOGICAL(LGT) :: isok + + CHARACTER(*), PARAMETER :: testName = & + "test14: Vector Vector spacetime spacetime" + + CALL RANDOM_NUMBER(val1) + obj1 = NodalVariable(val1, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL RANDOM_NUMBER(val2) + obj2 = NodalVariable(val2, TypeFEVariableVector, TypeFEVariableSpaceTime) + + ans = NodalVariable( & + dim1=SIZE(val1, 1), & + dim2=SIZE(val1, 2), & + dim3=SIZE(val1, 3), & + rank=TypeFEVariableVector, & + vartype=TypeFEVariableSpaceTime) + + wantVal = val1 * val2 + + want = NodalVariable( & + wantVal, TypeFEVariableVector, TypeFEVariableSpaceTime) + + CALL Multiplication_(obj1, obj2, ans) + + isok = ans .EQ. want + + CALL OK(isok, testName) +END SUBROUTINE test14 + +END PROGRAM main diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_2.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_2.md index 3d091566..308b5082 100644 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_2.md +++ b/docs/docs-api/FEVariable/examples/_Multiplication_test_2.md @@ -1,111 +1,7 @@ ---- -title: FEVariable example 31b -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- +This example demonstrates the multiplication of two Vector FEVariables. The variables `obj1`, `obj2` can be `constant`, `space`, `time`, or `spaceTime`. The `varType` of ans depends on the `varType` of `obj1` and `obj2`. -# FEVariable example 31b +import CodeBlock from '@theme/CodeBlock'; -!!! note "" -This example tests * operator. Scalar Nodal Values +import CodeSnippet from '!!raw-loader!./_Multiplication_test_1.F90'; -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * space" - -```fortran -call display("=================================") -obj = NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) -CALL Display(obj, "constnat * space") -``` - -!!! note "space * space" - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) -CALL Display(obj, "space * space") -``` - -!!! note "constant * time" - -```fortran -call display("=================================") -obj = NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) -CALL Display(obj, "constant * time") -``` - -!!! note "time * time" - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) -CALL Display(obj, "time * time") -``` - -!!! note "constant * spacetime" - -```fortran -call display("=================================") -obj = NodalVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "constant * spacetime") -``` - -!!! note "spacetime * spacetime" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "spacetime * spacetime") -``` - -```fortran -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_3.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_3.md deleted file mode 100644 index a2d7c285..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_3.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: FEVariable example 31c -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/QuadratureVariable - - FEVariable/Display ---- - -# FEVariable example 31c - -!!! note "" -This example tests multiplication (*) operator. Scalar Quadrature - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * constant" - -```fortran -obj = QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "constant * constant") -``` - -```fortran -obj = QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * 1.0_DFP -CALL Display(obj, "constant * constant") -``` - -!!! note "space * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) & - * QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "space * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) & - * 1.0_DFP -CALL Display(obj, "space * constant") -``` - -!!! note "time * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) & - * QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "time * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) & - * 1.0_DFP -CALL Display(obj, "time * constant") -``` - -!!! note "spacetime * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) & - * QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) -CALL Display(obj, "spacetime * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) & - * 1.0_DFP -CALL Display(obj, "spacetime * constant") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_4.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_4.md deleted file mode 100644 index d8b3373e..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_4.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: FEVariable example 31d -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- - -# FEVariable example 31d - -!!! note "" -This example tests * operator. Scalar Quadrature - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * space" - -```fortran -call display("=================================") -obj = QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) -CALL Display(obj, "constnat * space") -``` - -!!! note "space * space" - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableSpace ) -CALL Display(obj, "space * space") -``` - -!!! note "constant * time" - -```fortran -call display("=================================") -obj = QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) -CALL Display(obj, "constant * time") -``` - -!!! note "time * time" - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableScalar, & - & typeFEVariableTime ) -CALL Display(obj, "time * time") -``` - -!!! note "constant * spacetime" - -```fortran -call display("=================================") -obj = QuadratureVariable( 1.0_DFP, & - & typeFEVariableScalar, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "constant * spacetime") -``` - -!!! note "spacetime * spacetime" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableScalar, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "spacetime * spacetime") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_5.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_5.md deleted file mode 100644 index 5719eb41..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_5.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: FEVariable example 32a -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- - -# FEVariable example 32a - -!!! note "" -This example tests * operator. Vector, Nodal - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * constant" - -```fortran -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "constant * constant") -``` - -```fortran -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * 1.0_DFP -CALL Display(obj, "constant * constant") -``` - -!!! note "space * constant" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "space * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) & - * 1.0_DFP -CALL Display(obj, "space * constant") -``` - -!!! note "time * constant" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "time * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) & - * 1.0_DFP -CALL Display(obj, "time * constant") -``` - -!!! note "spacetime * constant" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) & - * NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "spacetime * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) & - * 1.0_DFP -CALL Display(obj, "spacetime * constant") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_6.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_6.md deleted file mode 100644 index 318e80d6..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_6.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: FEVariable example 32b -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- - -# FEVariable example 32b - -!!! note "" -This example tests * operator. Vector, Nodal - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * space" - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) -CALL Display(obj, "constant * space") -``` - -!!! note "space * space" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) -CALL Display(obj, "space * space") -``` - -!!! note "constant * time" - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) -CALL Display(obj, "constant*time") -``` - -!!! note "time*time" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) -CALL Display(obj, "time * time") -``` - -!!! note "constant * spacetime" - -```fortran -call display("=================================") -obj = NodalVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "constant * spacetime") -``` - -!!! note "spacetime * spacetime" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) & - * NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "spacetime * spacetime") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_7.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_7.md deleted file mode 100644 index 92853364..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_7.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: FEVariable example 32c -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/QuadratureVariable - - FEVariable/Display ---- - -# FEVariable example 32c - -!!! note "" -This example tests * operator. Vector, Quadrature - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * constant" - -```fortran -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "constant * constant") -``` - -```fortran -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * 1.0_DFP -CALL Display(obj, "constant * constant") -``` - -!!! note "space * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "space * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) & - * 1.0_DFP -CALL Display(obj, "space * constant") -``` - -!!! note "time * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "time * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) & - * 1.0_DFP -CALL Display(obj, "time * constant") -``` - -!!! note "spacetime * constant" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) & - * QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) -CALL Display(obj, "spacetime * constant") -``` - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) & - * 1.0_DFP -CALL Display(obj, "spacetime * constant") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_8.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_8.md deleted file mode 100644 index 4414b460..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_8.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: FEVariable example 32d -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- - -# FEVariable example 32d - -!!! note "" -This example tests * operator. vector, quadrature values - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * space" - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) -CALL Display(obj, "constant * space") -``` - -!!! note "space * space" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableSpace ) -CALL Display(obj, "space * space") -``` - -!!! note "constant * time" - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) -CALL Display(obj, "constant * time") -``` - -!!! note "time * time" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 6.0_DFP),[3,2]), & - & typeFEVariableVector, & - & typeFEVariableTime ) -CALL Display(obj, "time * time") -``` - -!!! note "constant * spacetime" - -```fortran -call display("=================================") -obj = QuadratureVariable( arange(1.0_DFP, 3.0_DFP), & - & typeFEVariableVector, & - & typeFEVariableConstant ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "constant * spacetime") -``` - -!!! note "spacetime * spacetime" - -```fortran -call display("=================================") -obj = QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) & - * QuadratureVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableVector, & - & typeFEVariableSpaceTime ) -CALL Display(obj, "spacetime * spacetime") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/FEVariable/examples/_Multiplication_test_9.md b/docs/docs-api/FEVariable/examples/_Multiplication_test_9.md deleted file mode 100644 index 5d640798..00000000 --- a/docs/docs-api/FEVariable/examples/_Multiplication_test_9.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: FEVariable example 33a -author: Vikas Sharma, Ph. D. -date: 21 Nov 2021 -update: 21 Nov 2021 -tags: - - FEVariable/NodalVariable - - FEVariable/Display ---- - -# FEVariable example 33a - -!!! note "" -This example tests * operator. Matrix, Nodal - -## Use association - -- [[FEVariable_]] - -## Usage - -!!! note "Import modules and declare variable" - -```fortran -PROGRAM main - USE easifemBase - IMPLICIT NONE - TYPE(FEVariable_) :: obj -``` - -!!! note "constant * constant" - -```fortran -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "constant * constant") -``` - -```fortran -obj = NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) & - * 1.0_DFP -CALL Display(obj, "constant * constant") -``` - -!!! note "space * constant" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "space * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpace ) & - * 1.0_DFP -CALL Display(obj, "space * constant") -``` - -!!! note "time * constant" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "time * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 12.0_DFP), [3,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableTime ) & - * 1.0_DFP -CALL Display(obj, "time * constant") -``` - -!!! note "spacetime * constant" - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) & - * NodalVariable( reshape(arange(1.0_DFP, 6.0_DFP), [3,2]), & - & typeFEVariableMatrix, & - & typeFEVariableConstant ) -CALL Display(obj, "spacetime * constant") -``` - -```fortran -call display("=================================") -obj = NodalVariable( reshape(arange(1.0_DFP, 24.0_DFP), [3,2,2,2]), & - & typeFEVariableMatrix, & - & typeFEVariableSpaceTime ) & - * 1.0_DFP -CALL Display(obj, "spacetime * constant") -``` - -```fortran -END PROGRAM main -``` diff --git a/docs/docs-api/ForceVector/examples/_ForceVector_Line_test_1.F90 b/docs/docs-api/ForceVector/examples/_ForceVector_Line_test_1.F90 new file mode 100644 index 00000000..764e3cb5 --- /dev/null +++ b/docs/docs-api/ForceVector/examples/_ForceVector_Line_test_1.F90 @@ -0,0 +1,190 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-09-04 +! summary: Testing ForceVector on line element +! +! Following interface is tested +! +! INTERFACE ForceVector +! MODULE PURE FUNCTION ForceVector1(test) RESULT(ans) +! CLASS(ElemshapeData_), INTENT(IN) :: test +! REAL(DFP), ALLOCATABLE :: ans(:) +! END FUNCTION ForceVector1 +! END INTERFACE ForceVector + +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE BaseType, ONLY: ElemShapeData_, & + QuadraturePoint_, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + TypeH1, & + TypeLagrangeInterpolation, & + TypeElemNameOpt + +USE ReferenceElement_Method +USE ReferenceLine_Method +USE QuadraturePoint_Method +USE ElemShapeData_Method +USE Display_Method +USE String_Class +USE ForceVector_Method +USE ReallocateUtility + +IMPLICIT NONE + +TYPE(ElemShapeData_) :: elemsd +TYPE(QuadraturePoint_) :: quad +REAL(DFP), ALLOCATABLE :: forcevec(:) +INTEGER(I4B) :: quadratureType, ipType, basisType, & + order, xidim, nsd, elemType, tsize, nns +REAL(DFP), ALLOCATABLE :: xij(:, :) +CHARACTER(:), ALLOCATABLE :: domainName, test_name + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + ! Initiate quadrature points + order = 2 + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%line + domainName = "BIUNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + CALL Display(xij(1:nsd, 1:nns), "xij: ") + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=order, quadratureType=quadratureType, xij=xij) + + order = 1 + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-1: order = 1, Monomial, Equidistance, Line" + + CALL Display(test_name) + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, & + val=xij(1:nsd, 1:nns), & + N=elemsd%N(1:elemsd%nns, 1:elemsd%nips), & + dNdXi=elemsd%dNdXi(1:elemsd%nns, 1:elemsd%xidim, 1:elemsd%nns)) + + ! CALL Display(elemsd, "elemsd: ") + + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + CALL Display(forcevec, "forcevec:") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + ! Initiate quadrature points + order = 4 + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%line + domainName = "BIUNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + nns = GetTotalNodes(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + CALL Display(xij(1:nsd, 1:nns), "xij: ") + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=order, quadratureType=quadratureType, & + xij=xij(1:nsd, 1:nns)) + + order = 2 + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-2: order = 2, Monomial, Equidistance, Line" + + CALL Display(test_name) + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, & + val=xij(1:nsd, 1:nns), & + N=elemsd%N(1:elemsd%nns, 1:elemsd%nips), & + dNdXi=elemsd%dNdXi(1:elemsd%nns, 1:elemsd%xidim, 1:elemsd%nns)) + + ! CALL Display(elemsd, "elemsd: ") + + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + CALL Display(forcevec, "forcevec:") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + ! Initiate quadrature points + order = 6 + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%line + domainName = "BIUNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + nns = GetTotalNodes(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + CALL Display(xij(1:nsd, 1:nns), "xij: ") + + xij = RefCoord(elemType, domainName) + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=order, quadratureType=quadratureType, & + xij=xij(1:nsd, 1:nns)) + + order = 3 + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-3: order = 2, Monomial, Equidistance, Line" + + CALL Display(test_name) + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, & + val=xij(1:nsd, 1:nns), & + N=elemsd%N(1:elemsd%nns, 1:elemsd%nips), & + dNdXi=elemsd%dNdXi(1:elemsd%nns, 1:elemsd%xidim, 1:elemsd%nns)) + + ! CALL Display(elemsd, "elemsd: ") + + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + CALL Display(forcevec, "forcevec:") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/ForceVector/examples/_ForceVector_Quadrangle_test_1.F90 b/docs/docs-api/ForceVector/examples/_ForceVector_Quadrangle_test_1.F90 new file mode 100644 index 00000000..60dcab38 --- /dev/null +++ b/docs/docs-api/ForceVector/examples/_ForceVector_Quadrangle_test_1.F90 @@ -0,0 +1,211 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-09-04 +! summary: Testing ForceVector on quadrangle element +! +! Following interface is tested +! +! INTERFACE ForceVector +! MODULE PURE FUNCTION ForceVector1(test) RESULT(ans) +! CLASS(ElemshapeData_), INTENT(IN) :: test +! REAL(DFP), ALLOCATABLE :: ans(:) +! END FUNCTION ForceVector1 +! END INTERFACE ForceVector + +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE BaseType, ONLY: ElemShapeData_, & + QuadraturePoint_, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + TypeH1, & + TypeLagrangeInterpolation, & + TypeElemNameOpt + +USE ReferenceElement_Method +USE ReferenceLine_Method +USE QuadraturePoint_Method +USE ElemShapeData_Method +USE Display_Method +USE String_Class +USE ForceVector_Method +USE ReallocateUtility +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(ElemShapeData_) :: elemsd, geoelemsd +TYPE(QuadraturePoint_) :: quad +REAL(DFP), ALLOCATABLE :: forcevec(:) +INTEGER(I4B) :: quadratureType, ipType, basisType, & + xidim, nsd, elemType, tsize, nns +REAL(DFP), ALLOCATABLE :: xij(:, :) +CHARACTER(:), ALLOCATABLE :: domainName, test_name + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 2, order = 1 + LOGICAL(LGT) :: isok + + ! Initiate quadrature points + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%quadrangle + domainName = "BIUNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, xij=xij) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-1: order = 1, Monomial, Equidistance, Quadrangle" + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, val=xij(1:nsd, 1:nns), N=geoelemsd%N, & + dNdXi=geoelemsd%dNdXi) + + ! CALL Display(xij(1:nsd, 1:nns), "xij: ") + ! CALL Display(elemsd, "elemsd: ") + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + + isok = SUM(forcevec) .APPROXEQ.4.0_DFP + CALL OK(isok, test_name) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 4, order = 2 + LOGICAL(LGT) :: isok + + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%quadrangle + domainName = "BIUNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + nns = GetTotalNodes(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, & + xij=xij(1:nsd, 1:nns)) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-2: order = 2, Monomial, Equidistance, Quadrangle" + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, & + val=xij(1:nsd, 1:nns), & + N=geoelemsd%N, & + dNdXi=geoelemsd%dNdXi) + + ! CALL Display(xij(1:nsd, 1:nns), "elemsd%xij: ") + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + ! CALL Display(SUM(forcevec), "sum forcevec: ") + + isok = SUM(forcevec) .APPROXEQ.4.0_DFP + CALL OK(isok, test_name) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 6, order = 3 + LOGICAL(LGT) :: isok + + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%quadrangle + domainName = "BIUNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + nns = GetTotalNodes(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, & + xij=xij(1:nsd, 1:nns)) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-3: order = 3, Monomial, Equidistance, Quadrangle" + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, val=xij(1:nsd, 1:nns), N=geoelemsd%N, & + dNdXi=geoelemsd%dNdXi) + + ! CALL Display(xij(1:nsd, 1:nns), "elemsd%xij: ") + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + ! CALL Display(SUM(forcevec), "sum forcevec: ") + + isok = SUM(forcevec) .APPROXEQ.4.0_DFP + CALL OK(isok, test_name) +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/ForceVector/examples/_ForceVector_Triangle_test_1.F90 b/docs/docs-api/ForceVector/examples/_ForceVector_Triangle_test_1.F90 new file mode 100644 index 00000000..8f9444c7 --- /dev/null +++ b/docs/docs-api/ForceVector/examples/_ForceVector_Triangle_test_1.F90 @@ -0,0 +1,207 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-09-04 +! summary: Testing ForceVector on triangle element +! +! Following interface is tested +! +! INTERFACE ForceVector +! MODULE PURE FUNCTION ForceVector1(test) RESULT(ans) +! CLASS(ElemshapeData_), INTENT(IN) :: test +! REAL(DFP), ALLOCATABLE :: ans(:) +! END FUNCTION ForceVector1 +! END INTERFACE ForceVector + +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE BaseType +USE ReferenceElement_Method +USE ReferenceLine_Method +USE QuadraturePoint_Method +USE ElemShapeData_Method +USE Display_Method +USE String_Class +USE ForceVector_Method +USE ReallocateUtility +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(ElemShapeData_) :: elemsd, geoelemsd +TYPE(QuadraturePoint_) :: quad +REAL(DFP), ALLOCATABLE :: forcevec(:) +INTEGER(I4B) :: quadratureType, ipType, basisType, & + xidim, nsd, elemType, tsize, nns +REAL(DFP), ALLOCATABLE :: xij(:, :) +CHARACTER(:), ALLOCATABLE :: domainName, test_name + + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 2, order = 1 + LOGICAL(LGT) :: isok + + ! Initiate quadrature points + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%triangle + domainName = "UNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, xij=xij) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-1: order = 1, Monomial, Equidistance, Triangle" + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, & + val=xij(1:nsd, 1:nns), & + N=geoelemsd%N, & + dNdXi=geoelemsd%dNdXi) + + ! CALL Display(xij(1:nsd, 1:nns), "xij: ") + ! CALL Display(elemsd, "elemsd: ") + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + + isok = SUM(forcevec) .EQ. 0.5_DFP + CALL OK(isok, test_name) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 4, order = 2 + LOGICAL(LGT) :: isok + + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%triangle + domainName = "UNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + nns = GetTotalNodes(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, & + xij=xij(1:nsd, 1:nns)) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-2: order = 2, Monomial, Equidistance, Triangle" + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, & + val=xij(1:nsd, 1:nns), & + N=geoelemsd%N, & + dNdXi=geoelemsd%dNdXi) + + ! CALL Display(xij(1:nsd, 1:nns), "elemsd%xij: ") + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + ! CALL Display(SUM(forcevec), "sum forcevec: ") + + isok = SUM(forcevec) .APPROXEQ.0.5_DFP + CALL OK(isok, test_name) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 6, order = 3 + LOGICAL(LGT) :: isok + + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%triangle + domainName = "UNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + nns = GetTotalNodes(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, & + xij=xij(1:nsd, 1:nns)) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-3: order = 3, Monomial, Equidistance, Triangle" + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, val=xij(1:nsd, 1:nns), N=geoelemsd%N, & + dNdXi=geoelemsd%dNdXi) + + ! CALL Display(xij(1:nsd, 1:nns), "elemsd%xij: ") + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize) + ! CALL Display(SUM(forcevec), "sum forcevec: ") + + isok = SUM(forcevec) .APPROXEQ.0.5_DFP + CALL OK(isok, test_name) +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/ForceVector/examples/_ForceVector_Triangle_test_2.F90 b/docs/docs-api/ForceVector/examples/_ForceVector_Triangle_test_2.F90 new file mode 100644 index 00000000..f9e14245 --- /dev/null +++ b/docs/docs-api/ForceVector/examples/_ForceVector_Triangle_test_2.F90 @@ -0,0 +1,168 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-09-04 +! summary: Testing ForceVector on triangle element +! +! Following interface is tested +! +! INTERFACE ForceVector +! MODULE PURE FUNCTION ForceVector1(test) RESULT(ans) +! CLASS(ElemshapeData_), INTENT(IN) :: test +! REAL(DFP), ALLOCATABLE :: ans(:) +! END FUNCTION ForceVector1 +! END INTERFACE ForceVector + +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE BaseType +USE ReferenceElement_Method +USE ReferenceLine_Method +USE QuadraturePoint_Method +USE ElemShapeData_Method +USE Display_Method +USE String_Class +USE ForceVector_Method +USE ReallocateUtility +USE Test_Method +USE ApproxUtility +USE FEVariable_Method +USE OnesUtility + +IMPLICIT NONE + +TYPE(ElemShapeData_) :: elemsd, geoelemsd +TYPE(QuadraturePoint_) :: quad +TYPE(FEVariable_) :: fevar +REAL(DFP), ALLOCATABLE :: forcevec(:) +INTEGER(I4B) :: quadratureType, ipType, basisType, & + xidim, nsd, elemType, tsize, nns +REAL(DFP), ALLOCATABLE :: xij(:, :) +CHARACTER(:), ALLOCATABLE :: domainName, test_name + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 4, order = 2 + LOGICAL(LGT) :: isok + + ! Initiate quadrature points + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%triangle + domainName = "UNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, xij=xij) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-1: order = 1, Monomial, Equidistance, Triangle" + CALL Display(test_name) + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, val=xij(1:nsd, 1:nns), & + N=geoelemsd%N, dNdXi=geoelemsd%dNdXi) + + fevar = NodalVariable(val=1.0_DFP, rank=TypeFEVariableScalar, & + vartype=TypeFEVariableConstant) + + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize, c=fevar, & + crank=TypeFEVariableScalar) + + isok = SUM(forcevec) .APPROXEQ.0.5_DFP + CALL OK(isok, test_name) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), PARAMETER :: geoorder = 1, quadorder = 4, order = 2 + LOGICAL(LGT) :: isok + REAL(DFP), ALLOCATABLE :: val(:) + + quadratureType = TypeQuadratureOpt%gaussLegendre + elemtype = TypeElemNameOpt%triangle + domainName = "UNIT" + nsd = Xidimension(elemtype) + xidim = Xidimension(elemtype) + nns = GetTotalNodes(elemtype) + xij = RefCoord(elemType, domainName) + nns = GetTotalNodes(elemType) + + CALL Initiate(obj=quad, elemType=elemType, domainName=domainName, & + order=quadorder, quadratureType=quadratureType, & + xij=xij(1:nsd, 1:nns)) + + ipType = TypeQuadratureOpt%equidistance + basisType = TypePolynomialOpt%monomial + test_name = "test-2: order = 2, Monomial, Equidistance, Triangle" + + CALL LagrangeElemshapeData(obj=elemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=order, ipType=ipType, & + basisType=basisType) + + CALL LagrangeElemshapeData(obj=geoelemsd, quad=quad, & + nsd=nsd, xidim=xidim, & + elemType=elemType, & + refelemCoord=xij(1:nsd, 1:nns), & + domainName=domainName, & + order=geoorder, ipType=ipType, & + basisType=basisType) + + CALL Set(obj=elemsd, val=xij(1:nsd, 1:nns), N=geoelemsd%N, & + dNdXi=geoelemsd%dNdXi) + + val = Ones(elemsd%nns, 1.0_DFP) + + fevar = NodalVariable(val=val, rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpace) + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize, & + c=fevar, crank=TypeFEVariableScalar) + + isok = SUM(forcevec) .APPROXEQ.0.5_DFP + CALL OK(isok, test_name) + + val = Ones(elemsd%nips, 1.0_DFP) + fevar = QuadratureVariable(val=val, rank=TypeFEVariableScalar, & + vartype=TypeFEVariableSpace) + CALL Reallocate(forcevec, elemsd%nns) + CALL ForceVector_(test=elemsd, ans=forcevec, tsize=tsize, & + c=fevar, crank=TypeFEVariableScalar) + + isok = SUM(forcevec) .APPROXEQ.0.5_DFP + CALL OK(isok, test_name) +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/ForceVector/examples/runner.toml b/docs/docs-api/ForceVector/examples/runner.toml new file mode 100644 index 00000000..b0812248 --- /dev/null +++ b/docs/docs-api/ForceVector/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/ForceVector" +TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetFacetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetFacetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..44ed63b6 --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetFacetQuadraturePoints_test_1.F90 @@ -0,0 +1,66 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + TYPE(QuadraturePoint_) :: quad, facetQuad + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "Quadrature points order=2 : ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +! SUBROUTINE test2 +! ! Changing the order of quadrature points +! CALL feptr%SetQuadratureOrder(order=[4_I4B]) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=4 : ") +! +! ! Changing the order of quadrature points +! CALL feptr%SetQuadratureOrder(order1=6_I4B) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=6 : ") +! +! ! Changing the quadrature type +! CALL feptr%SetQuadratureType(quadratureType= & +! [TypeQuadratureOpt%GaussLegendreLobatto]) +! CALL feptr%SetQuadratureOrder(order1=3_I4B) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=3 : ") +! END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetGlobalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetGlobalElemShapeData_test_1.F90 new file mode 100644 index 00000000..0eeb3dad --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetGlobalElemShapeData_test_1.F90 @@ -0,0 +1,153 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1HierarchicalFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CLASS(AbstractFE_), POINTER :: feptr + TYPE(QuadraturePoint_) :: quad + TYPE(ElemShapeData_) :: elemsd, geoelemsd + REAL(DFP) :: refElemCoord(3, 2) + INTEGER(I4B) :: nrow, ncol + + CALL Display("test1: elemsd%order=4 : cellorient=1") + + feptr => LineH1HierarchicalFEPointer( & + order=1, nsd=1, cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%SetOrder(order=1) + CALL feptr%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd, "elemsd: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + CLASS(AbstractFE_), POINTER :: feptr + TYPE(QuadraturePoint_) :: quad + TYPE(ElemShapeData_) :: elemsd, geoelemsd + REAL(DFP) :: refElemCoord(3, 2) + INTEGER(I4B) :: nrow, ncol + + CALL Display("test2: elemsd%order=4 : cellorient=1") + + feptr => LineH1HierarchicalFEPointer( & + order=1, nsd=1, cellOrient=[-1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%SetOrder(order=1) + CALL feptr%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd, "elemsd: ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +!---------------------------------------------------------------------------- +! Result of test1 +!---------------------------------------------------------------------------- +! +! N: +! -------------------- +! 0.788675 0.211325 +! 0.211325 0.788675 +! -0.408248 -0.408248 +! 0.304290 -0.304290 +! -0.103935 -0.103935 +! +! dNdXi:( :, :, 1 ) = +! -------------------- +! -0.500000 +! 0.500000 +! -0.707107 +! -0.000000 +! 0.720082 +! +! dNdXi:( :, :, 2 ) = +! -------------------- +! -0.500000 +! 0.500000 +! 0.707107 +! -0.000000 +! -0.720082 +! +!---------------------------------------------------------------------------- +! Results of test2 +!---------------------------------------------------------------------------- +! +! N: +! -------------------- +! 0.788675 0.211325 +! 0.211325 0.788675 +! -0.408248 -0.408248 +! -0.304290 0.304290 +! -0.103935 -0.103935 +! +! dNdXi:( :, :, 1 ) = +! -------------------- +! -0.500000 +! 0.500000 +! 0.707107 +! -0.000000 +! -0.720082 +! +! dNdXi:( :, :, 2 ) = +! -------------------- +! -0.500000 +! 0.500000 +! -0.707107 +! -0.000000 +! 0.720082 diff --git a/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetLocalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetLocalElemShapeData_test_1.F90 new file mode 100644 index 00000000..548f17f6 --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetLocalElemShapeData_test_1.F90 @@ -0,0 +1,83 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1HierarchicalFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CLASS(AbstractFE_), POINTER :: feptr => NULL() + TYPE(QuadraturePoint_) :: quad + TYPE(ElemShapeData_) :: elemsd + + CALL Display("test1") + CALL Display("order = 1, cellOrient=1") + feptr => LineH1HierarchicalFEPointer( & + order=1, nsd=1, cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") + + CALL Display("order = 4, cellOrient=1") + CALL feptr%SetOrder(order=4) + + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + CLASS(AbstractFE_), POINTER :: feptr => NULL() + TYPE(QuadraturePoint_) :: quad + TYPE(ElemShapeData_) :: elemsd + ! Lets change the order of element shape data + + CALL Display("test2") + CALL Display("order = 1, cellOrient=-1") + feptr => LineH1HierarchicalFEPointer( & + order=1, nsd=1, cellOrient=[-1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") + + CALL Display("order = 4, cellOrient=-1") + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..37b89f78 --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_GetQuadraturePoints_test_1.F90 @@ -0,0 +1,86 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1HierarchicalFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE Display_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => LineH1HierarchicalFEPointer( & + order=1, nsd=1, cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +!---------------------------------------------------------------------------- +! contains +!---------------------------------------------------------------------------- + +CONTAINS + +SUBROUTINE test1 + TYPE(QuadraturePoint_) :: quad + CALL Display("test1") + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=2 : ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + TYPE(QuadraturePoint_) :: quad + ! Changing the order of quadrature points + CALL Display("test2") + CALL feptr%SetQuadratureOrder(order=[4_I4B]) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=4 : ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + TYPE(QuadraturePoint_) :: quad + ! Changing the order of quadrature points + CALL Display("test3") + CALL feptr%SetQuadratureOrder(order1=6_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=6 : ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + TYPE(QuadraturePoint_) :: quad + ! Changing the quadrature type + CALL Display("test4") + CALL feptr%SetQuadratureType(quadratureType= & + [TypeQuadratureOpt%GaussLegendreLobatto]) + CALL feptr%SetQuadratureOrder(order1=3_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=3 : ") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_LineH1HierarchicalFEPointer_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_LineH1HierarchicalFEPointer_test_1.F90 new file mode 100644 index 00000000..099b1c4a --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/_LineH1HierarchicalFEPointer_test_1.F90 @@ -0,0 +1,29 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1HierarchicalFE_Class +USE BaseType, ONLY: TypeInterpolationOpt, TypePolynomialOpt, & + TypeQuadratureOpt + +IMPLICIT NONE + +CALL test1 + +CONTAINS +SUBROUTINE test1 + CLASS(AbstractFE_), POINTER :: feptr => NULL() + + feptr => LineH1HierarchicalFEPointer( & + order=1, nsd=1, cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2], quadratureAlpha=[0.0_DFP], & + quadratureBeta=[0.0_DFP], quadratureLambda=[0.5_DFP]) + + CALL feptr%Display("feptr test1: ") +END SUBROUTINE test1 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/runner.toml b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/runner.toml new file mode 100644 index 00000000..9f2a9f9f --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1HierarchicalFE/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/H1FE/LineH1HierarchicalFE" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..44ed63b6 --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 @@ -0,0 +1,66 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + TYPE(QuadraturePoint_) :: quad, facetQuad + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "Quadrature points order=2 : ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +! SUBROUTINE test2 +! ! Changing the order of quadrature points +! CALL feptr%SetQuadratureOrder(order=[4_I4B]) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=4 : ") +! +! ! Changing the order of quadrature points +! CALL feptr%SetQuadratureOrder(order1=6_I4B) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=6 : ") +! +! ! Changing the quadrature type +! CALL feptr%SetQuadratureType(quadratureType= & +! [TypeQuadratureOpt%GaussLegendreLobatto]) +! CALL feptr%SetQuadratureOrder(order1=3_I4B) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=3 : ") +! END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 new file mode 100644 index 00000000..243cbf6b --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 @@ -0,0 +1,94 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr1 => NULL(), feptr2 => NULL() +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: elemsd, geoelemsd +REAL(DFP) :: refElemCoord(3, 8) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr1 => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +feptr1 => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + cellOrient=[-1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol + + CALL Display("test1: elemsd%order=4 : cellorient=1") + CALL feptr1%GetQuadraturePoints(quad=quad) + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr1%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd%N, "elemsd%N: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + CALL feptr2%GetQuadraturePoints(quad=quad) + CALL feptr2%SetOrder(order=1) + CALL feptr2%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr2%SetOrder(order=4) + CALL feptr2%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr2%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr2%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd%N, "elemsd%N: ") + + ! CALL feptr2%Display("feptr2: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetInterpolationPoints_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetInterpolationPoints_test_1.F90 new file mode 100644 index 00000000..517fe6bb --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetInterpolationPoints_test_1.F90 @@ -0,0 +1,125 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +REAL(DFP) :: refElemCoord(3, 8), xij(3, 100) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], alpha=[0.0_DFP], & + beta=[0.0_DFP], lambda=[0.5_DFP], cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2], quadratureAlpha=[0.0_DFP], & + quadratureBeta=[0.0_DFP], quadratureLambda=[0.5_DFP]) + +CALL test1 +CALL test2 +CALL test3 + +CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test1: order=1, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[1], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test2: order=2, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[2], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test3: order=3, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test4: order=3, ipType=GaussLegendreLobatto") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%GaussLegendreLobatto]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 new file mode 100644 index 00000000..4697500e --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 @@ -0,0 +1,43 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: elemsd + +feptr => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], alpha=[0.0_DFP], & + beta=[0.0_DFP], lambda=[0.5_DFP], cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2], quadratureAlpha=[0.0_DFP], & + quadratureBeta=[0.0_DFP], quadratureLambda=[0.5_DFP]) + +CALL feptr%GetQuadraturePoints(quad=quad) +CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) +CALL Display(elemsd%N, "elemsd%N: ") + +! Lets change the order of element shape data + +CALL feptr%SetOrder(order=2) +CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) +CALL Display(elemsd%N, "elemsd%N: ") + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..981e23cb --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_GetQuadraturePoints_test_1.F90 @@ -0,0 +1,51 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad +! TYPE(ElemShapeData_) :: elemsd + +feptr => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], alpha=[0.0_DFP], & + beta=[0.0_DFP], lambda=[0.5_DFP], cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2], quadratureAlpha=[0.0_DFP], & + quadratureBeta=[0.0_DFP], quadratureLambda=[0.5_DFP]) + +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=2 : ") + +! Changing the order of quadrature points +CALL feptr%SetQuadratureOrder(order=[4_I4B]) +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=4 : ") + +! Changing the order of quadrature points +CALL feptr%SetQuadratureOrder(order1=6_I4B) +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=6 : ") + +! Changing the quadrature type +CALL feptr%SetQuadratureType(quadratureType= & + [TypeQuadratureOpt%GaussLegendreLobatto]) +CALL feptr%SetQuadratureOrder(order1=3_I4B) +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=3 : ") + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_LineH1LagrangeFEPointer_test_1.F90 b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_LineH1LagrangeFEPointer_test_1.F90 new file mode 100644 index 00000000..3bd7b47f --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/_LineH1LagrangeFEPointer_test_1.F90 @@ -0,0 +1,26 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE LineH1LagrangeFE_Class +USE BaseType, ONLY: TypeInterpolationOpt, TypePolynomialOpt, & + TypeQuadratureOpt + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => LineH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], alpha=[0.0_DFP], & + beta=[0.0_DFP], lambda=[0.5_DFP], cellOrient=[1_I4B, 0_I4B, 0_I4B], & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2], quadratureAlpha=[0.0_DFP], & + quadratureBeta=[0.0_DFP], quadratureLambda=[0.5_DFP]) + +CALL feptr%Display("LineH1LagrangeFE: ") + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/LineH1LagrangeFE/runner.toml b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/runner.toml new file mode 100644 index 00000000..12f60670 --- /dev/null +++ b/docs/docs-api/H1FE/examples/LineH1LagrangeFE/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/H1FE/LineH1LagrangeFE" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetDOFValueFromQuadrature_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetDOFValueFromQuadrature_test_1.F90 new file mode 100644 index 00000000..63366cf3 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetDOFValueFromQuadrature_test_1.F90 @@ -0,0 +1,352 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +PURE ELEMENTAL FUNCTION func1(x, y) RESULT(ans) + REAL(DFP), INTENT(IN) :: x, y + REAL(DFP) :: ans + ! ans = 1.0_DFP + ! ans = x**2 + y**2 + ans = y + y**2 + y**3 +END FUNCTION func1 + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: iface = 2 + INTEGER(I4B), PARAMETER :: nptrs(5) = [2, 3, 8, 9, 10] + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: iface = 3 + INTEGER(I4B), PARAMETER :: nptrs(5) = [3, 4, 11, 12, 13] + + CALL Display("test3: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = 1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: iface = 4 + INTEGER(I4B), PARAMETER :: nptrs(5) = [4, 1, 14, 15, 16] + + CALL Display("test4: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = 1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetDOFValueFromUserFunction_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetDOFValueFromUserFunction_test_1.F90 new file mode 100644 index 00000000..8ca93c12 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetDOFValueFromUserFunction_test_1.F90 @@ -0,0 +1,660 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1HierarchicalFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE UserFunction_Class +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_, & + TypeFEVariableOpt, & + iface_ScalarFunction + +USE Display_Method +USE Test_Method +USE ApproxUtility +USE LobattoPolynomialUtility + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 +CALL test5 +CALL test6 + +CONTAINS + +PURE FUNCTION scalarFunc1(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + REAL(DFP) :: a + a = x(1) + ans = LobattoEval(n=0, x=a) +END FUNCTION scalarFunc1 + +PURE FUNCTION scalarFunc2(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + REAL(DFP) :: a + a = x(1) + ans = LobattoEval(n=1, x=a) +END FUNCTION scalarFunc2 + +PURE FUNCTION scalarFunc3(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + + REAL(DFP) :: a + a = x(1) + ans = LobattoEval(n=2, x=a) +END FUNCTION scalarFunc3 + +PURE FUNCTION scalarFunc4(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + + REAL(DFP) :: a + a = x(1) + ans = LobattoEval(n=3, x=a) +END FUNCTION scalarFunc4 + +PURE FUNCTION scalarFunc5(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + + REAL(DFP) :: a + a = x(1) + ans = LobattoEval(n=4, x=a) +END FUNCTION scalarFunc5 + +PURE FUNCTION scalarFunc6(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + + REAL(DFP) :: a + a = x(1) + ans = LobattoEval(n=0, x=a) + & + LobattoEval(n=1, x=a) + & + LobattoEval(n=2, x=a) + & + 2.0_DFP * LobattoEval(n=3, x=a) + & + 3.0_DFP * LobattoEval(n=4, x=a) +END FUNCTION scalarFunc6 + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-20 +! summary: This test is like test1 but in this case we check onlyFaceBubble + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + ! PROCEDURE(iface_ScalarFunction), POINTER :: scalarFunction + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + CHARACTER(*), PARAMETER :: testname = "test1" + LOGICAL(LGT) :: isok + + ! CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + ! scalarFunction => scalarFunc1 + CALL func%Set(scalarFunction=scalarFunc1) + + cellOrder = 1 + faceOrder(1:3, 1:4) = 1 + + cellOrient = 1 + faceOrient(1:3, 1:4) = 1 + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + !! Only internal points + exactAns = 0.0_DFP + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, onlyFaceBubble=.TRUE.) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + ! PROCEDURE(iface_ScalarFunction), POINTER :: scalarFunction + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + CHARACTER(*), PARAMETER :: testname = "test2" + LOGICAL(LGT) :: isok + + ! CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + ! scalarFunction => scalarFunc1 + CALL func%Set(scalarFunction=scalarFunc2) + + cellOrder = 1 + faceOrder(1:3, 1:4) = 1 + + cellOrient = 1 + faceOrient(1:3, 1:4) = 1 + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + !! Only internal points + exactAns = 0.0_DFP + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, onlyFaceBubble=.TRUE.) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + CHARACTER(*), PARAMETER :: testname = "test3" + LOGICAL(LGT) :: isok + + ! CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + CALL func%Set(scalarFunction=scalarFunc3) + + cellOrder = 1 + faceOrder(1:3, 1:4) = 1 + + cellOrient = 1 + faceOrient(1:3, 1:4) = 1 + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + !! Only internal points + exactAns = 0.0_DFP + exactAns(1) = 1.0_DFP + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, onlyFaceBubble=.TRUE.) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + ! PROCEDURE(iface_ScalarFunction), POINTER :: scalarFunction + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + CHARACTER(*), PARAMETER :: testname = "test4" + LOGICAL(LGT) :: isok + + ! CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + ! scalarFunction => scalarFunc1 + CALL func%Set(scalarFunction=scalarFunc4) + + cellOrder = 1 + faceOrder(1:3, 1:4) = 1 + + cellOrient = 1 + faceOrient(1:3, 1:4) = 1 + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + !! Only internal points + exactAns = 0.0_DFP + exactAns(2) = 1.0_DFP + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, onlyFaceBubble=.TRUE.) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test5 + INTEGER(I4B) :: nrow, ncol, tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + ! PROCEDURE(iface_ScalarFunction), POINTER :: scalarFunction + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + CHARACTER(*), PARAMETER :: testname = "test5" + LOGICAL(LGT) :: isok + + ! CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + ! scalarFunction => scalarFunc1 + CALL func%Set(scalarFunction=scalarFunc5) + + cellOrder = 1 + faceOrder(1:3, 1:4) = 1 + + cellOrient = 1 + faceOrient(1:3, 1:4) = 1 + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + !! Only internal points + exactAns = 0.0_DFP + exactAns(3) = 1.0_DFP + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, onlyFaceBubble=.TRUE.) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test5 + +!---------------------------------------------------------------------------- +! test6 +!---------------------------------------------------------------------------- + +SUBROUTINE test6 + INTEGER(I4B) :: nrow, ncol, tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + ! PROCEDURE(iface_ScalarFunction), POINTER :: scalarFunction + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + CHARACTER(*), PARAMETER :: testname = "test6" + LOGICAL(LGT) :: isok + + ! CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + ! scalarFunction => scalarFunc1 + CALL func%Set(scalarFunction=scalarFunc6) + + cellOrder = 1 + faceOrder(1:3, 1:4) = 1 + + cellOrient = 1 + faceOrient(1:3, 1:4) = 1 + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + !! Only internal points + exactAns(1:3) = [1.0_DFP, 2.0_DFP, 3.0_DFP] + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, onlyFaceBubble=.TRUE.) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test6 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..eaa56619 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetFacetQuadraturePoints_test_1.F90 @@ -0,0 +1,59 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Display_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad, facetQuad + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 +! CALL test3 +! CALL test4 +! CALL test5 +! CALL test6 + +CONTAINS + +SUBROUTINE test1 + CALL Display("test1: ") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "quad: ") + CALL Display(facetQuad, "facetQuad: ") +END SUBROUTINE test1 + +SUBROUTINE test2 + ! Changing the order of quadrature points + CALL Display("test2: ") + CALL feptr%SetQuadratureOrder(order=[4_I4B]) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "quad: ") + CALL Display(facetQuad, "facetQuad: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalElemShapeData_test_1.F90 new file mode 100644 index 00000000..83340070 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalElemShapeData_test_1.F90 @@ -0,0 +1,83 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1HierarchicalFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +! CALL feptr1%Display("feptr1: ") +CALL test2 +! CALL feptr2%Display("feptr2: ") + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CLASS(AbstractFE_), POINTER :: feptr + TYPE(QuadraturePoint_) :: quad + TYPE(ElemShapeData_) :: elemsd, geoelemsd + INTEGER(I4B) :: nrow, ncol, cellOrder(3), faceOrder(3, 4), & + cellOrient(3), faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500) + + CALL Display("test1") + + cellOrder = 1 + faceOrder(1:2, 1:4) = 1 + cellOrient = 1 + faceOrient(1:2, 1:4) = 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[4], ipType=[TypeInterpolationOpt%Equidistance]) + CALL Initiate(quad, xij(1:3, 1:ncol)) + + CALL feptr%SetOrder(order=1) + CALL feptr%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd%N(1:5, 1:5), "elemsd%N(1:5, 1:5): ", full=.TRUE.) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalElemShapeData_test_2.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalElemShapeData_test_2.F90 new file mode 100644 index 00000000..eab975f6 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalElemShapeData_test_2.F90 @@ -0,0 +1,492 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Generating shape functions on collection of Quadrangle elements + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1HierarchicalFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE VTKPlot_Class +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr1, feptr2, feptr3, feptr4 +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: geoelemsd, elemsd1, elemsd2, elemsd3, elemsd4 +INTEGER(I4B), PARAMETER :: interpolationOrder = 19 +INTEGER(I4B) :: cellCon(25, 4) +REAL(DFP) :: elemCoord(3, 4, 4) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +cellCon(1:25, 1) = [1, 5, 9, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, & + 19, 20, 21, 46, 47, 48, 49, 50, 51, 52, 53, 54] + +cellCon(1:25, 2) = [8, 9, 7, 4, 16, 17, 18, 22, 23, 24, 25, 26, 27, 28, 29, & + 30, 55, 56, 57, 58, 59, 60, 61, 62, 63] + +cellCon(1:25, 3) = [5, 2, 6, 9, 31, 32, 33, 34, 35, 36, 37, 38, 39, & + 13, 14, 15, 64, 65, 66, 67, 68, 69, 70, 71, 72] + +cellCon(1:25, 4) = [9, 6, 3, 7, 37, 38, 39, 40, 41, 42, 43, 44, 45, & + 22, 23, 24, 73, 74, 75, 76, 77, 78, 79, 80, 81] + +elemCoord = 0.0_DFP +elemCoord(1:2, 1, 1) = [0.0_DFP, 0.0_DFP] +elemCoord(1:2, 2, 1) = [1.0_DFP, 0.0_DFP] +elemCoord(1:2, 3, 1) = [1.0_DFP, 1.0_DFP] +elemCoord(1:2, 4, 1) = [0.0_DFP, 1.0_DFP] + +elemCoord(1:2, 1, 2) = [0.0_DFP, 1.0_DFP] +elemCoord(1:2, 2, 2) = [1.0_DFP, 1.0_DFP] +elemCoord(1:2, 3, 2) = [1.0_DFP, 2.0_DFP] +elemCoord(1:2, 4, 2) = [0.0_DFP, 2.0_DFP] + +elemCoord(1:2, 1, 3) = [1.0_DFP, 0.0_DFP] +elemCoord(1:2, 2, 3) = [2.0_DFP, 0.0_DFP] +elemCoord(1:2, 3, 3) = [2.0_DFP, 1.0_DFP] +elemCoord(1:2, 4, 3) = [1.0_DFP, 1.0_DFP] + +elemCoord(1:2, 1, 4) = [1.0_DFP, 1.0_DFP] +elemCoord(1:2, 2, 4) = [2.0_DFP, 1.0_DFP] +elemCoord(1:2, 3, 4) = [2.0_DFP, 2.0_DFP] +elemCoord(1:2, 4, 4) = [1.0_DFP, 2.0_DFP] + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL testPlotData1 +CALL testPlotData2 +CALL testPlotData3 +CALL testPlotData4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), cellOrient(3), cellOrder(3), & + faceOrder(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500) + + CALL Display("test1") + CALL Display("element1") + CALL Display(cellCon(1:4, 1), "Global node numbers: ") + + cellOrder = 1; faceOrder = 1 + cellOrient = 1; faceOrient = 1 + faceOrient(1, 1:4) = [1, 1, -1, -1] + ! CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + feptr1 => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr1%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd1, quad=quad) + + CALL feptr1%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4, 1), & + elemsd=elemsd1, geoelemsd=geoelemsd) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), cellOrient(3), cellOrder(3), & + faceOrder(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500) + + CALL Display("test2") + CALL Display("element2") + CALL Display(cellCon(1:4, 2), "Global node numbers: ") + + cellOrder = 1; faceOrder = 1 + cellOrient = 1; faceOrient = 1 + faceOrient(1, 1:4) = [1, -1, -1, +1] + ! CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + feptr2 => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr2%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr2%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr2%SetOrder(order=1) + CALL feptr2%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr2%SetOrder(order=4) + CALL feptr2%GetLocalElemShapeData(elemsd=elemsd2, quad=quad) + + CALL feptr2%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4, 2), & + elemsd=elemsd2, geoelemsd=geoelemsd) + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), cellOrient(3), cellOrder(3), & + faceOrder(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500) + + CALL Display("test3") + CALL Display("element3") + CALL Display(cellCon(1:4, 3), "Global node numbers: ") + + cellOrder = 1; faceOrder = 1 + cellOrient = 1; faceOrient = 1 + faceOrient(1, 1:4) = [-1, 1, 1, -1] + ! CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + feptr1 => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr1%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd3, quad=quad) + + CALL feptr1%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4, 3), & + elemsd=elemsd3, geoelemsd=geoelemsd) + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), cellOrient(3), cellOrder(3), & + faceOrder(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500) + + CALL Display("test4") + CALL Display("element4") + CALL Display(cellCon(1:4, 4), "Global node numbers: ") + + cellOrder = 1; faceOrder = 1 + cellOrient = 1; faceOrient = 1 + faceOrient(1, 1:4) = [-1, -1, 1, 1] + ! CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + feptr1 => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr1%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd4, quad=quad) + + CALL feptr1%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4, 4), & + elemsd=elemsd4, geoelemsd=geoelemsd) + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! testPlotdata1 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotdata1 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotdata1 start") + + tsize = elemsd1%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd1: + nips = elemsd1%nips + tdof = elemsd1%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd1%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd1%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 1)) = elemsd1%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem1", & + filename="Order4_Elem1_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotdata1 end") +END SUBROUTINE testPlotdata1 + +!---------------------------------------------------------------------------- +! testPlotData2 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotData2 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotData2 start") + + tsize = elemsd2%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd2: + nips = elemsd2%nips + tdof = elemsd2%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd2%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd2%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 2)) = elemsd2%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem2", & + filename="Order4_Elem2_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotData2 end") +END SUBROUTINE testPlotData2 + +!---------------------------------------------------------------------------- +! testPlotData3 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotData3 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotData3 start") + + tsize = elemsd3%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd3: + nips = elemsd3%nips + tdof = elemsd3%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd3%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd3%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 3)) = elemsd3%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem3", & + filename="Order4_Elem3_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotData3 end") +END SUBROUTINE testPlotData3 + +!---------------------------------------------------------------------------- +! testPlotData4 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotData4 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotData4 start") + + tsize = elemsd4%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd4: + nips = elemsd4%nips + tdof = elemsd4%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd4%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd4%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 4)) = elemsd4%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem4", & + filename="Order4_Elem4_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotData4 end") +END SUBROUTINE testPlotData4 + +!---------------------------------------------------------------------------- +! testPlotData +!---------------------------------------------------------------------------- + +! SUBROUTINE testPlotData +! TYPE(VTKPlot_) :: plot +! REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) +! INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii +! +! CALL Display("testPlotData start") +! +! tsize = elemsd1%nips + elemsd2%nips + elemsd3%nips + elemsd4%nips +! +! CALL Display(tsize, "plotData, tsize: ") +! +! CALL Reallocate(xij, tsize, 2) +! CALL Reallocate(plotData, tsize, 81) +! +! ! elemsd1: +! ! nips = elemsd1%nips +! ! tdof = elemsd1%nns +! ! n1 = 1; n2 = nips +! ! xij(n1:n2, 1) = elemsd1%coord(1, 1:nips) +! ! xij(n1:n2, 2) = elemsd1%coord(2, 1:nips) +! ! DO ii = 1, tdof +! ! plotData(n1:n2, cellCon(ii, 1)) = elemsd1%N(ii, 1:nips) +! ! END DO +! +! ! elemsd2: +! nips = elemsd2%nips +! tdof = elemsd2%nns +! n1 = n2 + 1; n2 = n2 + nips +! xij(n1:n2, 1) = elemsd2%coord(1, 1:nips) +! xij(n1:n2, 2) = elemsd2%coord(2, 1:nips) +! DO ii = 1, tdof +! plotData(n1:n2, cellCon(ii, 2)) = elemsd2%N(ii, 1:nips) +! END DO +! +! ! nips = elemsd3%nips +! ! tdof = elemsd3%nns +! ! n1 = n2 + 1; n2 = n2 + nips +! ! xij(n1:n2, 1) = elemsd3%coord(1, 1:nips) +! ! xij(n1:n2, 2) = elemsd3%coord(2, 1:nips) +! ! DO ii = 1, tdof +! ! plotData(n1:n2, cellCon(ii, 3)) = elemsd3%N(ii, 1:nips) +! ! END DO +! ! +! ! nips = elemsd4%nips +! ! tdof = elemsd4%nns +! ! n1 = n2 + 1; n2 = n2 + nips +! ! xij(n1:n2, 1) = elemsd4%coord(1, 1:nips) +! ! xij(n1:n2, 2) = elemsd4%coord(2, 1:nips) +! ! DO ii = 1, tdof +! ! plotData(n1:n2, cellCon(ii, 4)) = elemsd4%N(ii, 1:nips) +! ! END DO +! +! CALL plot%Initiate() +! +! DO ii = 1, 81 +! CALL plot%Scatter3D(x=xij(1:tsize, 1), & +! y=xij(1:tsize, 2), & +! z=plotData(1:tsize, ii), label="N", & +! filename="Order4_N"//ToString(ii)//".vtp") +! END DO +! +! CALL plot%DEALLOCATE() +! +! CALL Display("testPlotData end") +! END SUBROUTINE testPlotData + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalFacetElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalFacetElemShapeData_test_1.F90 new file mode 100644 index 00000000..708cc63d --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetGlobalFacetElemShapeData_test_1.F90 @@ -0,0 +1,249 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +! CALL test2 +! CALL test3 +! CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 2 + INTEGER(I4B), PARAMETER :: nptrs(5) = [2, 3, 8, 9, 10] + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 3 + INTEGER(I4B), PARAMETER :: nptrs(5) = [3, 4, 11, 12, 13] + + CALL Display("test3: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 4 + INTEGER(I4B), PARAMETER :: nptrs(5) = [4, 1, 14, 15, 16] + + CALL Display("test4: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetInterpolationPoints_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetInterpolationPoints_test_1.F90 new file mode 100644 index 00000000..0a3efef6 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetInterpolationPoints_test_1.F90 @@ -0,0 +1,123 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing QuadrangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +REAL(DFP) :: refElemCoord(3, 8), xij(3, 100) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test1: order=1, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[1], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test2: order=2, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[2], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test3: order=3, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test4: order=3, ipType=GaussLegendreLobatto") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%GaussLegendreLobatto]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetLocalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetLocalElemShapeData_test_1.F90 new file mode 100644 index 00000000..d86e6d54 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetLocalElemShapeData_test_1.F90 @@ -0,0 +1,100 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing QuadrangleH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1HierarchicalFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE Display_Method +USE ExceptionHandler_Class, ONLY: EXCEPTION_INFORMATION, e + +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +! Get the default quadrature points +! Get the default element shape data +SUBROUTINE test1 + CLASS(AbstractFE_), POINTER :: feptr => NULL() + TYPE(QuadraturePoint_) :: quad + TYPE(ElemShapeData_) :: elemsd + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + + CALL Display("test1") + + cellOrder = 1 + faceOrder(1:2, 1:4) = 1 + cellOrient = 1 + faceOrient(1:2, 1:4) = 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +! Lets change the order of element shape data +! Get local element shape data +SUBROUTINE test2 + CLASS(AbstractFE_), POINTER :: feptr => NULL() + TYPE(QuadraturePoint_) :: quad + TYPE(ElemShapeData_) :: elemsd + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + + CALL Display("test2: Element shape data order (2)") + + cellOrder = 1 + faceOrder(1:2, 1:4) = 1 + cellOrient = 1 + faceOrient(1:2, 1:4) = 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! CALL feptr%Display("feptr: ") + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr%SetOrder(order=2) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetLocalFacetElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetLocalFacetElemShapeData_test_1.F90 new file mode 100644 index 00000000..92dccd32 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetLocalFacetElemShapeData_test_1.F90 @@ -0,0 +1,83 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing QuadrangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: EXCEPTION_INFORMATION, e +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +! Get the default quadrature points +! Get the default element shape data +SUBROUTINE test1 + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, facetElemsd + CALL Display("test1") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetQuad=facetQuad, facetElemsd=facetElemsd, & + localFaceNumber=1) + + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ") + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +! Lets change the order of element shape data +! Get local element shape data +SUBROUTINE test2 + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, facetElemsd + CALL Display("test2") + CALL feptr%SetOrder(order=2) + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetQuad=facetQuad, facetElemsd=facetElemsd, & + localFaceNumber=1) + + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ") + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..1ec0e938 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_GetQuadraturePoints_test_1.F90 @@ -0,0 +1,94 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 +CALL test5 +CALL test6 + +CONTAINS + +SUBROUTINE test1 + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(2,2) : ") +END SUBROUTINE test1 + +SUBROUTINE test2 + ! Changing the order of quadrature points + CALL feptr%SetQuadratureOrder(order=[4_I4B]) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(4,4) : ") +END SUBROUTINE test2 + +SUBROUTINE test3 + ! Changing the order of quadrature points + CALL feptr%SetQuadratureOrder(order=[4_I4B, 2_I4B]) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(4,2) : ") +END SUBROUTINE test3 + +SUBROUTINE test4 + ! Changing the order of quadrature points + ! If quadrature points isHomogenous is false then order(1) + ! will change. + CALL feptr%SetQuadratureOrder(order1=2_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(2, 2) : ") +END SUBROUTINE test4 + +SUBROUTINE test5 + ! Changing the order of quadrature points + ! If quadrature points isHomogenous is false then order(2) + ! will change. + CALL feptr%SetQuadratureOrder(order2=4_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(2, 4) : ") +END SUBROUTINE test5 + +SUBROUTINE test6 + ! Changing the order of quadrature points + ! If quadrature points isHomogenous is false then order(2) + ! will change. + CALL feptr%SetQuadratureOrder(order1=4_I4B, order2=4_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(4, 4) : ") +END SUBROUTINE test6 + +! SUBROUTINE test4 +! ! Changing the quadrature type +! CALL feptr%SetQuadratureType(quadratureType= & +! [TypeQuadratureOpt%GaussLegendreLobatto]) +! CALL feptr%SetQuadratureOrder(order1=2_I4B) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=2 : ") +! END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_QuadrangleH1HierarchicalFEPointer_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_QuadrangleH1HierarchicalFEPointer_test_1.F90 new file mode 100644 index 00000000..86842ee8 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/_QuadrangleH1HierarchicalFEPointer_test_1.F90 @@ -0,0 +1,51 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1HierarchicalFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1HierarchicalFE_Class +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, TypePolynomialOpt, & + TypeQuadratureOpt + +IMPLICIT NONE + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 + +!---------------------------------------------------------------------------- +! contains +!---------------------------------------------------------------------------- + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CLASS(AbstractFE_), POINTER :: feptr => NULL() + INTEGER(I4B) :: cellOrder(3), faceOrder(3, 4), cellOrient(3), & + faceOrient(3, 4) + + CALL Display("test1") + + cellOrder = 1 + faceOrder(1:2, 1:4) = 1 + cellOrient = 1 + faceOrient(1:2, 1:4) = 1 + + feptr => QuadrangleH1HierarchicalFEPointer( & + cellOrder=cellOrder, faceOrder=faceOrder, nsd=2, & + cellOrient=cellOrient, faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + CALL feptr%Display("feptr: ") +END SUBROUTINE test1 +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/runner.toml b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/runner.toml new file mode 100644 index 00000000..ffba295f --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1HierarchicalFE/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/H1FE/QuadrangleH1HierarchicalFE" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetDOFValue_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetDOFValue_test_1.F90 new file mode 100644 index 00000000..3cbc656a --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetDOFValue_test_1.F90 @@ -0,0 +1,193 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: In this test show how to get all the DOF values of an +! element from a user-defined function. In a way, we perform projection +! of a function on the FE space. + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE UserFunction_Class +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_, & + TypeFEVariableOpt, & + iface_ScalarFunction + +USE Display_Method +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! Parameters +!---------------------------------------------------------------------------- + +INTEGER(I4B), PARAMETER :: iface = 1 +INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] +INTEGER(I4B), PARAMETER :: order = 4 +CHARACTER(*), PARAMETER :: testname = "test1" +CHARACTER(*), PARAMETER :: myName = "main.out" +CHARACTER(*), PARAMETER :: modName = "GetElemDOFValueFromUserFunction_test_1" + +!---------------------------------------------------------------------------- +! Integer variables +!---------------------------------------------------------------------------- + +INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize, ii, ipiv(50), & + tFace + +!---------------------------------------------------------------------------- +! Real variables +!---------------------------------------------------------------------------- + +REAL(DFP) :: refElemCoord(3, 4), ans(50), exactAns(50), args(4), & + massMat(25, 25), funcValue(50), temp(50), xij(3, 25) + +!---------------------------------------------------------------------------- +! Logical variables +!---------------------------------------------------------------------------- + +LOGICAL(LGT) :: isok + +!---------------------------------------------------------------------------- +! Types +!---------------------------------------------------------------------------- + +TYPE(QuadraturePoint_) :: allQuad(8), allFacetQuad(8), cellQuad +TYPE(ElemShapeData_) :: cellElemsd, geoCellElemsd, allGeoElemsd(8), & + allGeoFacetElemsd(8), allElemsd(8), allFacetElemsd(8) +TYPE(UserFunction_) :: func, func1 + +!---------------------------------------------------------------------------- +! Pointers +!---------------------------------------------------------------------------- + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +!---------------------------------------------------------------------------- +! Main program +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL Display(testname) + +! obj, name, returnType, argType, numArgs, numReturns, luaScript, & +! luaFunctionName, returnShape +CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=4, & + numReturns=1) +CALL func%Set(scalarFunction=scalarFunc4) + +faceOrient(1, 1) = +1 ! 1 --> 2 +faceOrient(1, 2) = +1 ! 2 --> 3 +faceOrient(1, 3) = +1 ! 3 --> 4 +faceOrient(1, 4) = -1 ! 4 --> 1 + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + +! Get the reference element coordinates +CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + +! Get the interpolation points +CALL feptr%GetInterpolationPoints( & + xij=refElemCoord, ans=xij, nrow=nrow, ncol=ncol, & + ipType=[TypeInterpolationOpt%equidistance], order=[order]) + +! Getting quadrature for all facets +CALL feptr%GetAllFacetQuadraturePoints( & + quad=allQuad, facetQuad=allFacetQuad, tsize=tFace) + +CALL feptr%GetQuadraturePoints(quad=cellQuad) + +CALL feptr%SetOrder(order=1) +CALL feptr%GetAllLocalFacetElemShapeData( & + elemsd=allGeoElemsd, quad=allQuad, facetElemsd=allGeoFacetElemsd, & + facetQuad=allFacetQuad, tsize=tFace) + +CALL feptr%GetLocalElemShapeData(elemsd=geoCellElemsd, quad=cellQuad) + +CALL feptr%SetOrder(order=order) +CALL feptr%GetAllLocalFacetElemShapeData( & + elemsd=allElemsd, quad=allQuad, facetElemsd=allFacetElemsd, & + facetQuad=AllFacetQuad, tsize=tFace) + +CALL feptr%GetLocalElemShapeData(elemsd=cellElemsd, quad=cellQuad) + +CALL feptr%GetAllGlobalFacetElemShapeData( & + elemsd=allElemsd, facetElemsd=allFacetElemsd, tsize=tFace, & + geoElemsd=allGeoElemsd, geoFacetElemsd=allGeoFacetElemsd, & + xij=refElemCoord) + +CALL feptr%GetGlobalElemShapeData( & + elemsd=cellElemsd, xij=refElemCoord, geoElemsd=geoCellElemsd) + +CALL feptr%GetDOFValue( & + cellElemsd=cellElemsd, elemsd=allElemsd, facetElemsd=allFacetElemsd, & + xij=refElemCoord, times=0.0_DFP, func=func, ans=ans, tsize=tsize, & + massMat=massMat, ipiv=ipiv, funcValue=funcValue, temp=temp) + +CALL Display(tsize, 'tsize: ') +! CALL Display(ans(1:tsize), 'ans: ', full=.TRUE.) + +args = 0.0_DFP +DO ii = 1, tsize + args(1:2) = xij(1:2, ii) + CALL func%GetScalarValue(val=exactAns(ii), args=args) + isok = exactAns(ii) .approxeq.ans(ii) + CALL OK(isok, testname) +END DO + +!---------------------------------------------------------------------------- +! Contains +!---------------------------------------------------------------------------- + +CONTAINS + +PURE FUNCTION scalarFunc1(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = 1.0_DFP +END FUNCTION scalarFunc1 + +PURE FUNCTION scalarFunc2(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ! ans = 1.0_DFP + ans = x(1)**2 + x(2)**2 + ! ans = y + y**2 + y**3 +END FUNCTION scalarFunc2 + +PURE FUNCTION scalarFunc3(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 +END FUNCTION scalarFunc3 + +PURE FUNCTION scalarFunc4(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 +END FUNCTION scalarFunc4 + +PURE FUNCTION scalarFunc5(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 + x(1)**5 +END FUNCTION scalarFunc5 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetDOFValue_test_2.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetDOFValue_test_2.F90 new file mode 100644 index 00000000..a2a99ac4 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetDOFValue_test_2.F90 @@ -0,0 +1,176 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: In this test show how to get all the DOF values of an +! element from a user-defined function. In a way, we perform projection +! of a function on the FE space. + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE UserFunction_Class +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_, & + TypeFEVariableOpt, & + iface_ScalarFunction + +USE Display_Method +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +!---------------------------------------------------------------------------- +! Parameters +!---------------------------------------------------------------------------- + +INTEGER(I4B), PARAMETER :: iface = 1 +INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] +INTEGER(I4B), PARAMETER :: order = 4 +CHARACTER(*), PARAMETER :: testname = "test2" +CHARACTER(*), PARAMETER :: myName = "main.out" +CHARACTER(*), PARAMETER :: modName = "GetElemDOFValueFromUserFunction_test_1" + +!---------------------------------------------------------------------------- +! Integer variables +!---------------------------------------------------------------------------- + +INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize, ii, ipiv(50), & + tFace + +!---------------------------------------------------------------------------- +! Real variables +!---------------------------------------------------------------------------- + +REAL(DFP) :: refElemCoord(3, 4), ans(50), exactAns(50), args(4), & + massMat(25, 25), funcValue(50), temp(50), xij(3, 25) + +!---------------------------------------------------------------------------- +! Logical variables +!---------------------------------------------------------------------------- + +LOGICAL(LGT) :: isok + +!---------------------------------------------------------------------------- +! Types +!---------------------------------------------------------------------------- + +TYPE(QuadraturePoint_) :: quad(8), facetQuad(8), cellQuad +TYPE(ElemShapeData_) :: cellElemsd, geoCellElemsd, geoElemsd(8), & + geoFacetElemsd(8), elemsd(8), facetElemsd(8) +TYPE(UserFunction_) :: func, func1 + +!---------------------------------------------------------------------------- +! Pointers +!---------------------------------------------------------------------------- + +CLASS(AbstractFE_), POINTER :: feptr => NULL(), geofeptr => NULL() + +!---------------------------------------------------------------------------- +! Main program +!---------------------------------------------------------------------------- + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL Display(testname) + +! obj, name, returnType, argType, numArgs, numReturns, luaScript, & +! luaFunctionName, returnShape +CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=4, & + numReturns=1) +CALL func%Set(scalarFunction=scalarFunc4) + +faceOrient(1, 1) = +1 ! 1 --> 2 +faceOrient(1, 2) = +1 ! 2 --> 3 +faceOrient(1, 3) = +1 ! 3 --> 4 +faceOrient(1, 4) = -1 ! 4 --> 1 + +feptr => QuadrangleH1LagrangeFEPointer( & + order=order, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + +geofeptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + +! Get the reference element coordinates +CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + +! Get the interpolation points +CALL feptr%GetInterpolationPoints( & + xij=refElemCoord, ans=xij, nrow=nrow, ncol=ncol, & + ipType=[TypeInterpolationOpt%equidistance], order=[order]) + +CALL feptr%GetDOFValue( & + geofeptr=geofeptr, elemsd=elemsd, geoElemsd=geoElemsd, & + facetElemsd=facetElemsd, geoFacetElemsd=geoFacetElemsd, & + cellElemsd=cellElemsd, geoCellElemsd=geoCellElemsd, & + quad=quad, facetQuad=facetQuad, cellQuad=cellQuad, xij=refElemCoord, & + times=0.0_DFP, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, temp=temp) + +CALL Display(tsize, 'tsize: ') +! CALL Display(ans(1:tsize), 'ans: ', full=.TRUE.) + +args = 0.0_DFP +DO ii = 1, tsize + args(1:2) = xij(1:2, ii) + CALL func%GetScalarValue(val=exactAns(ii), args=args) + isok = exactAns(ii) .approxeq.ans(ii) + CALL OK(isok, testname) +END DO + +!---------------------------------------------------------------------------- +! Contains +!---------------------------------------------------------------------------- + +CONTAINS + +PURE FUNCTION scalarFunc1(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = 1.0_DFP +END FUNCTION scalarFunc1 + +PURE FUNCTION scalarFunc2(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ! ans = 1.0_DFP + ans = x(1)**2 + x(2)**2 + ! ans = y + y**2 + y**3 +END FUNCTION scalarFunc2 + +PURE FUNCTION scalarFunc3(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 +END FUNCTION scalarFunc3 + +PURE FUNCTION scalarFunc4(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 +END FUNCTION scalarFunc4 + +PURE FUNCTION scalarFunc5(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 + x(1)**5 +END FUNCTION scalarFunc5 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetDOFValueFromQuadrature_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetDOFValueFromQuadrature_test_1.F90 new file mode 100644 index 00000000..63366cf3 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetDOFValueFromQuadrature_test_1.F90 @@ -0,0 +1,352 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +PURE ELEMENTAL FUNCTION func1(x, y) RESULT(ans) + REAL(DFP), INTENT(IN) :: x, y + REAL(DFP) :: ans + ! ans = 1.0_DFP + ! ans = x**2 + y**2 + ans = y + y**2 + y**3 +END FUNCTION func1 + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: iface = 2 + INTEGER(I4B), PARAMETER :: nptrs(5) = [2, 3, 8, 9, 10] + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: iface = 3 + INTEGER(I4B), PARAMETER :: nptrs(5) = [3, 4, 11, 12, 13] + + CALL Display("test3: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = 1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: iface = 4 + INTEGER(I4B), PARAMETER :: nptrs(5) = [4, 1, 14, 15, 16] + + CALL Display("test4: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = 1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetDOFValueFromUserFunction_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetDOFValueFromUserFunction_test_1.F90 new file mode 100644 index 00000000..bbbb97ea --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetDOFValueFromUserFunction_test_1.F90 @@ -0,0 +1,518 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE UserFunction_Class +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_, & + TypeFEVariableOpt, & + iface_ScalarFunction + +USE Display_Method +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 +CALL test5 + +CONTAINS + +PURE FUNCTION scalarFunc1(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = 1.0_DFP +END FUNCTION scalarFunc1 + +PURE FUNCTION scalarFunc2(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ! ans = 1.0_DFP + ans = x(1)**2 + x(2)**2 + ! ans = y + y**2 + y**3 +END FUNCTION scalarFunc2 + +PURE FUNCTION scalarFunc3(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 +END FUNCTION scalarFunc3 + +PURE FUNCTION scalarFunc4(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 +END FUNCTION scalarFunc4 + +PURE FUNCTION scalarFunc5(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 + x(1)**5 +END FUNCTION scalarFunc5 + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize, ii, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), args(4), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + CHARACTER(*), PARAMETER :: testname = "test1" + LOGICAL(LGT) :: isok + + CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + ! scalarFunction => scalarFunc1 + CALL func%Set(scalarFunction=scalarFunc1) + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + DO ii = 1, SIZE(nptrs) + args = 0.0_DFP + args(1) = interpolCoord(1, nptrs(ii)) + args(2) = interpolCoord(2, nptrs(ii)) + CALL func%GetScalarValue(args=args, val=exactAns(ii)) + END DO + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize, ii, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), args(4), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + CHARACTER(*), PARAMETER :: testname = "test2" + LOGICAL(LGT) :: isok + + CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + CALL func%Set(scalarFunction=scalarFunc2) + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + DO ii = 1, SIZE(nptrs) + args = 0.0_DFP + args(1) = interpolCoord(1, nptrs(ii)) + args(2) = interpolCoord(2, nptrs(ii)) + CALL func%GetScalarValue(args=args, val=exactAns(ii)) + END DO + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize, ii, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), args(4), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + CHARACTER(*), PARAMETER :: testname = "test3" + LOGICAL(LGT) :: isok + + CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + CALL func%Set(scalarFunction=scalarFunc3) + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + DO ii = 1, SIZE(nptrs) + args = 0.0_DFP + args(1) = interpolCoord(1, nptrs(ii)) + args(2) = interpolCoord(2, nptrs(ii)) + CALL func%GetScalarValue(args=args, val=exactAns(ii)) + END DO + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize, ii, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), args(4), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + CHARACTER(*), PARAMETER :: testname = "test4" + LOGICAL(LGT) :: isok + + CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + CALL func%Set(scalarFunction=scalarFunc4) + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + DO ii = 1, SIZE(nptrs) + args = 0.0_DFP + args(1) = interpolCoord(1, nptrs(ii)) + args(2) = interpolCoord(2, nptrs(ii)) + CALL func%GetScalarValue(args=args, val=exactAns(ii)) + END DO + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! test5 +!---------------------------------------------------------------------------- + +SUBROUTINE test5 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4), tsize, ii, ipiv(10) + REAL(DFP) :: refElemCoord(3, 4), interpolCoord(3, 50), & + ans(50), exactAns(50), args(4), massMat(10, 10), & + funcValue(50) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(UserFunction_) :: func, func1 + + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + INTEGER(I4B), PARAMETER :: order = 4 + CHARACTER(*), PARAMETER :: testname = "test5" + LOGICAL(LGT) :: isok + + CALL Display(testname) + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=3, & + numReturns=1) + CALL func%Set(scalarFunction=scalarFunc4) + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2 * order]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + DO ii = 3, SIZE(nptrs) + args = 0.0_DFP + args(1) = interpolCoord(1, nptrs(ii)) + args(2) = interpolCoord(2, nptrs(ii)) + CALL func%GetScalarValue(args=args, val=exactAns(ii - 2)) + END DO + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromUserFunction( & + elemsd=elemsd, facetElemsd=facetElemsd, xij=refElemCoord, & + localFaceNumber=iface, func=func, ans=ans, tsize=tsize, massMat=massMat, & + ipiv=ipiv, funcValue=funcValue, onlyFaceBubble=.TRUE.) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, testname) + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF + +END SUBROUTINE test5 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..eaa56619 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 @@ -0,0 +1,59 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Display_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad, facetQuad + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 +! CALL test3 +! CALL test4 +! CALL test5 +! CALL test6 + +CONTAINS + +SUBROUTINE test1 + CALL Display("test1: ") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "quad: ") + CALL Display(facetQuad, "facetQuad: ") +END SUBROUTINE test1 + +SUBROUTINE test2 + ! Changing the order of quadrature points + CALL Display("test2: ") + CALL feptr%SetQuadratureOrder(order=[4_I4B]) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "quad: ") + CALL Display(facetQuad, "facetQuad: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 new file mode 100644 index 00000000..2a400abf --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 @@ -0,0 +1,114 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr1 => NULL(), feptr2 => NULL() +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: elemsd, geoelemsd + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +! CALL feptr1%Display("feptr1: ") +CALL test2 +! CALL feptr2%Display("feptr2: ") + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500) + + CALL Display("test1: isCellOrient = false: ") + + feptr1 => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + ! Getting quadrature for interpolation points + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr1%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[4], ipType=[TypeInterpolationOpt%Equidistance]) + CALL Initiate(quad, xij(1:3, 1:ncol)) + + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr1%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd%N(1:5, 1:5), "elemsd%N(1:5, 1:5): ", full=.TRUE.) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500) + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr2 => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + ! Getting quadrature for interpolation points + CALL feptr2%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr2%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[4], ipType=[TypeInterpolationOpt%Equidistance]) + CALL Initiate(quad, xij(1:3, 1:ncol)) + + CALL feptr2%SetOrder(order=1) + CALL feptr2%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr2%SetOrder(order=4) + CALL feptr2%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr2%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr2%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + ! CALL Display(elemsd%N, "elemsd%N: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalElemShapeData_test_2.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalElemShapeData_test_2.F90 new file mode 100644 index 00000000..73240f06 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalElemShapeData_test_2.F90 @@ -0,0 +1,498 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Generating shape functions on collection of Quadrangle elements + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE VTKPlot_Class +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr1, feptr2, feptr3, feptr4 +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: geoelemsd, elemsd1, elemsd2, elemsd3, elemsd4 +INTEGER(I4B), PARAMETER :: interpolationOrder = 19 +INTEGER(I4B) :: cellCon(25, 4) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +cellCon(1:25, 1) = [1, 5, 9, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, & + 19, 20, 21, 46, 47, 48, 49, 50, 51, 52, 53, 54] + +cellCon(1:25, 2) = [8, 9, 7, 4, 16, 17, 18, 22, 23, 24, 25, 26, 27, 28, 29, & + 30, 55, 56, 57, 58, 59, 60, 61, 62, 63] + +cellCon(1:25, 3) = [5, 2, 6, 9, 31, 32, 33, 34, 35, 36, 37, 38, 39, & + 13, 14, 15, 64, 65, 66, 67, 68, 69, 70, 71, 72] + +cellCon(1:25, 4) = [9, 6, 3, 7, 37, 38, 39, 40, 41, 42, 43, 44, 45, & + 22, 23, 24, 73, 74, 75, 76, 77, 78, 79, 80, 81] +CALL test1 +CALL test2 +CALL test3 +CALL test4 +! CALL testPlotData + +! call testPlotData1 +! call testPlotData2 +CALL testPlotData3 +CALL testPlotData4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500), elemCoord(3, 8) + + CALL Display("test1: element 1") + CALL Display([1, 5, 9, 8], "Global node numbers: ") + faceOrient = 0 + faceOrient(1, 1) = 1 + faceOrient(1, 2) = 1 + faceOrient(1, 3) = -1 + faceOrient(1, 4) = -1 + CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + elemCoord = 0.0_DFP + elemCoord(1:2, 1) = [0.0_DFP, 0.0_DFP] + elemCoord(1:2, 2) = [1.0_DFP, 0.0_DFP] + elemCoord(1:2, 3) = [1.0_DFP, 1.0_DFP] + elemCoord(1:2, 4) = [0.0_DFP, 1.0_DFP] + + feptr1 => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr1%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd1, quad=quad) + + CALL feptr1%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4), & + elemsd=elemsd1, geoelemsd=geoelemsd) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500), elemCoord(3, 8) + + CALL Display("test2: element 2") + CALL Display([8, 9, 7, 4], "Global node numbers: ") + + faceOrient = 0 + faceOrient(1, 1) = 1 + faceOrient(1, 2) = -1 + faceOrient(1, 3) = -1 + faceOrient(1, 4) = 1 + CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + elemCoord = 0.0_DFP + elemCoord(1:2, 1) = [0.0_DFP, 1.0_DFP] + elemCoord(1:2, 2) = [1.0_DFP, 1.0_DFP] + elemCoord(1:2, 3) = [1.0_DFP, 2.0_DFP] + elemCoord(1:2, 4) = [0.0_DFP, 2.0_DFP] + + feptr2 => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr2%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr2%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr2%SetOrder(order=1) + CALL feptr2%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr2%SetOrder(order=4) + CALL feptr2%GetLocalElemShapeData(elemsd=elemsd2, quad=quad) + + CALL feptr2%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4), & + elemsd=elemsd2, geoelemsd=geoelemsd) + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500), elemCoord(3, 8) + + CALL Display("test3: element 3") + CALL Display([5, 2, 6, 9], "Global node numbers: ") + + faceOrient = 0 + faceOrient(1, 1) = -1 + faceOrient(1, 2) = 1 + faceOrient(1, 3) = 1 + faceOrient(1, 4) = -1 + CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + elemCoord = 0.0_DFP + elemCoord(1:2, 1) = [1.0_DFP, 0.0_DFP] + elemCoord(1:2, 2) = [2.0_DFP, 0.0_DFP] + elemCoord(1:2, 3) = [2.0_DFP, 1.0_DFP] + elemCoord(1:2, 4) = [1.0_DFP, 1.0_DFP] + + feptr3 => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr3%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr3%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr3%SetOrder(order=1) + CALL feptr3%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr3%SetOrder(order=4) + CALL feptr3%GetLocalElemShapeData(elemsd=elemsd3, quad=quad) + + CALL feptr3%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4), & + elemsd=elemsd3, geoelemsd=geoelemsd) + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 8), xij(3, 500), elemCoord(3, 8) + + CALL Display("test4: element 4") + CALL Display([9, 6, 3, 7], "Global node numbers: ") + ! 9, 6, 3, 7 + + faceOrient = 0 + faceOrient(1, 1) = -1 + faceOrient(1, 2) = -1 + faceOrient(1, 3) = 1 + faceOrient(1, 4) = 1 + CALL Display(faceOrient(1, 1:4), "faceOrient: ") + + elemCoord = 0.0_DFP + elemCoord(1:2, 1) = [1.0_DFP, 1.0_DFP] + elemCoord(1:2, 2) = [2.0_DFP, 1.0_DFP] + elemCoord(1:2, 3) = [2.0_DFP, 2.0_DFP] + elemCoord(1:2, 4) = [1.0_DFP, 2.0_DFP] + + feptr4 => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + + CALL feptr4%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr4%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:4), ans=xij, nrow=nrow, ncol=ncol, & + order=[interpolationOrder], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr4%SetOrder(order=1) + CALL feptr4%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr4%SetOrder(order=4) + CALL feptr4%GetLocalElemShapeData(elemsd=elemsd4, quad=quad) + + CALL feptr4%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:4), & + elemsd=elemsd4, geoelemsd=geoelemsd) + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! testPlotdata1 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotdata1 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotdata1 start") + + tsize = elemsd1%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd1: + nips = elemsd1%nips + tdof = elemsd1%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd1%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd1%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 1)) = elemsd1%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem1", & + filename="Order4_Elem1_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotdata1 end") +END SUBROUTINE testPlotdata1 + +!---------------------------------------------------------------------------- +! testPlotData2 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotData2 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotData2 start") + + tsize = elemsd2%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd2: + nips = elemsd2%nips + tdof = elemsd2%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd2%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd2%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 2)) = elemsd2%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem2", & + filename="Order4_Elem2_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotData2 end") +END SUBROUTINE testPlotData2 + +!---------------------------------------------------------------------------- +! testPlotData3 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotData3 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotData3 start") + + tsize = elemsd3%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd3: + nips = elemsd3%nips + tdof = elemsd3%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd3%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd3%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 3)) = elemsd3%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem3", & + filename="Order4_Elem3_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotData3 end") +END SUBROUTINE testPlotData3 + +!---------------------------------------------------------------------------- +! testPlotData4 +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotData4 + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotData4 start") + + tsize = elemsd4%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd4: + nips = elemsd4%nips + tdof = elemsd4%nns + n1 = 1; n2 = nips + xij(n1:n2, 1) = elemsd4%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd4%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 4)) = elemsd4%N(ii, 1:nips) + END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="Elem4", & + filename="Order4_Elem4_"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotData4 end") +END SUBROUTINE testPlotData4 + +!---------------------------------------------------------------------------- +! testPlotData +!---------------------------------------------------------------------------- + +SUBROUTINE testPlotData + TYPE(VTKPlot_) :: plot + REAL(DFP), ALLOCATABLE :: plotData(:, :), xij(:, :) + INTEGER(I4B) :: tsize, n1, n2, nips, tdof, ii + + CALL Display("testPlotData start") + + tsize = elemsd1%nips + elemsd2%nips + elemsd3%nips + elemsd4%nips + + CALL Display(tsize, "plotData, tsize: ") + + CALL Reallocate(xij, tsize, 2) + CALL Reallocate(plotData, tsize, 81) + + ! elemsd1: + ! nips = elemsd1%nips + ! tdof = elemsd1%nns + ! n1 = 1; n2 = nips + ! xij(n1:n2, 1) = elemsd1%coord(1, 1:nips) + ! xij(n1:n2, 2) = elemsd1%coord(2, 1:nips) + ! DO ii = 1, tdof + ! plotData(n1:n2, cellCon(ii, 1)) = elemsd1%N(ii, 1:nips) + ! END DO + + ! elemsd2: + nips = elemsd2%nips + tdof = elemsd2%nns + n1 = n2 + 1; n2 = n2 + nips + xij(n1:n2, 1) = elemsd2%coord(1, 1:nips) + xij(n1:n2, 2) = elemsd2%coord(2, 1:nips) + DO ii = 1, tdof + plotData(n1:n2, cellCon(ii, 2)) = elemsd2%N(ii, 1:nips) + END DO + + ! nips = elemsd3%nips + ! tdof = elemsd3%nns + ! n1 = n2 + 1; n2 = n2 + nips + ! xij(n1:n2, 1) = elemsd3%coord(1, 1:nips) + ! xij(n1:n2, 2) = elemsd3%coord(2, 1:nips) + ! DO ii = 1, tdof + ! plotData(n1:n2, cellCon(ii, 3)) = elemsd3%N(ii, 1:nips) + ! END DO + ! + ! nips = elemsd4%nips + ! tdof = elemsd4%nns + ! n1 = n2 + 1; n2 = n2 + nips + ! xij(n1:n2, 1) = elemsd4%coord(1, 1:nips) + ! xij(n1:n2, 2) = elemsd4%coord(2, 1:nips) + ! DO ii = 1, tdof + ! plotData(n1:n2, cellCon(ii, 4)) = elemsd4%N(ii, 1:nips) + ! END DO + + CALL plot%Initiate() + + DO ii = 1, 81 + CALL plot%Scatter3D(x=xij(1:tsize, 1), & + y=xij(1:tsize, 2), & + z=plotData(1:tsize, ii), label="N", & + filename="Order4_N"//ToString(ii)//".vtp") + END DO + + CALL plot%DEALLOCATE() + + CALL Display("testPlotData end") +END SUBROUTINE testPlotData + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalFacetElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalFacetElemShapeData_test_1.F90 new file mode 100644 index 00000000..708cc63d --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetGlobalFacetElemShapeData_test_1.F90 @@ -0,0 +1,249 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +! CALL test2 +! CALL test3 +! CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 5, 6, 7] + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 2 + INTEGER(I4B), PARAMETER :: nptrs(5) = [2, 3, 8, 9, 10] + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 3 + INTEGER(I4B), PARAMETER :: nptrs(5) = [3, 4, 11, 12, 13] + + CALL Display("test3: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 4) + REAL(DFP) :: refElemCoord(3, 4) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 4 + INTEGER(I4B), PARAMETER :: nptrs(5) = [4, 1, 14, 15, 16] + + CALL Display("test4: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = +1 ! 3 --> 4 + faceOrient(1, 4) = -1 ! 4 --> 1 + + feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + faceOrient=faceOrient, & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=4) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + !elemsd, facetElemsd, localFaceNumber, geoElemsd, geoFacetElemsd, xij) + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + CALL Display(elemsd%N(nptrs, 1:elemsd%nips), "elemsd%N: ", full=.TRUE.) + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ", full=.TRUE.) +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetInterpolationPoints_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetInterpolationPoints_test_1.F90 new file mode 100644 index 00000000..0a3efef6 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetInterpolationPoints_test_1.F90 @@ -0,0 +1,123 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing QuadrangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +REAL(DFP) :: refElemCoord(3, 8), xij(3, 100) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[1]) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test1: order=1, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[1], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test2: order=2, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[2], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test3: order=3, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test4: order=3, ipType=GaussLegendreLobatto") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%GaussLegendreLobatto]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 new file mode 100644 index 00000000..a31c94f5 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 @@ -0,0 +1,70 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing QuadrangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: EXCEPTION_INFORMATION, e +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: elemsd + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +! Get the default quadrature points +! Get the default element shape data +SUBROUTINE test1 + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + CALL Display("test1: Element shape data order(1)") + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") + CALL Display(SUM(elemsd%N(1:elemsd%nns, 1:elemsd%nips)), & + "sum(elemsd%N): ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +! Lets change the order of element shape data +! Get local element shape data +SUBROUTINE test2 + CALL feptr%SetOrder(order=2) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + CALL Display("test2: Element shape data order (2)") + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") + CALL Display(SUM(elemsd%N(1:elemsd%nns, 1:elemsd%nips)), & + "sum(elemsd%N): ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetLocalFacetElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetLocalFacetElemShapeData_test_1.F90 new file mode 100644 index 00000000..92dccd32 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetLocalFacetElemShapeData_test_1.F90 @@ -0,0 +1,83 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing QuadrangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: EXCEPTION_INFORMATION, e +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +! Get the default quadrature points +! Get the default element shape data +SUBROUTINE test1 + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, facetElemsd + CALL Display("test1") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetQuad=facetQuad, facetElemsd=facetElemsd, & + localFaceNumber=1) + + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ") + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +! Lets change the order of element shape data +! Get local element shape data +SUBROUTINE test2 + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, facetElemsd + CALL Display("test2") + CALL feptr%SetOrder(order=2) + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetQuad=facetQuad, facetElemsd=facetElemsd, & + localFaceNumber=1) + + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ") + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..1ec0e938 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_GetQuadraturePoints_test_1.F90 @@ -0,0 +1,94 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 +CALL test5 +CALL test6 + +CONTAINS + +SUBROUTINE test1 + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(2,2) : ") +END SUBROUTINE test1 + +SUBROUTINE test2 + ! Changing the order of quadrature points + CALL feptr%SetQuadratureOrder(order=[4_I4B]) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(4,4) : ") +END SUBROUTINE test2 + +SUBROUTINE test3 + ! Changing the order of quadrature points + CALL feptr%SetQuadratureOrder(order=[4_I4B, 2_I4B]) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(4,2) : ") +END SUBROUTINE test3 + +SUBROUTINE test4 + ! Changing the order of quadrature points + ! If quadrature points isHomogenous is false then order(1) + ! will change. + CALL feptr%SetQuadratureOrder(order1=2_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(2, 2) : ") +END SUBROUTINE test4 + +SUBROUTINE test5 + ! Changing the order of quadrature points + ! If quadrature points isHomogenous is false then order(2) + ! will change. + CALL feptr%SetQuadratureOrder(order2=4_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(2, 4) : ") +END SUBROUTINE test5 + +SUBROUTINE test6 + ! Changing the order of quadrature points + ! If quadrature points isHomogenous is false then order(2) + ! will change. + CALL feptr%SetQuadratureOrder(order1=4_I4B, order2=4_I4B) + CALL feptr%GetQuadraturePoints(quad=quad) + CALL Display(quad, "Quadrature points order=(4, 4) : ") +END SUBROUTINE test6 + +! SUBROUTINE test4 +! ! Changing the quadrature type +! CALL feptr%SetQuadratureType(quadratureType= & +! [TypeQuadratureOpt%GaussLegendreLobatto]) +! CALL feptr%SetQuadratureOrder(order1=2_I4B) +! CALL feptr%GetQuadraturePoints(quad=quad) +! CALL Display(quad, "Quadrature points order=2 : ") +! END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_QuadrangleH1LagrangeFEPointer_test_1.F90 b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_QuadrangleH1LagrangeFEPointer_test_1.F90 new file mode 100644 index 00000000..df44a8b5 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/_QuadrangleH1LagrangeFEPointer_test_1.F90 @@ -0,0 +1,25 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE QuadrangleH1LagrangeFE_Class +USE BaseType, ONLY: TypeInterpolationOpt, TypePolynomialOpt, & + TypeQuadratureOpt + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => QuadrangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=[TypePolynomialOpt%monomial], & + quadratureIsHomogeneous=.TRUE., & + quadratureType=[TypeQuadratureOpt%GaussLegendre], & + quadratureOrder=[2]) + +CALL feptr%Display("QuadrangleH1LagrangeFE: ") + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/runner.toml b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/runner.toml new file mode 100644 index 00000000..fdd54516 --- /dev/null +++ b/docs/docs-api/H1FE/examples/QuadrangleH1LagrangeFE/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/H1FE/QuadrangleH1LagrangeFE" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N11.vtp b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N11.vtp new file mode 100644 index 00000000..4e55d725 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N11.vtp @@ -0,0 +1,29 @@ + + + + + + + + + + + 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.100000000000000E+001 0.710542735760100E-014 0.526315789473684E-001 0.000000000000000E+000 0.000000000000000E+000 0.105263157894737E+000 0.000000000000000E+000 0.000000000000000E+000 0.157894736842105E+000 0.000000000000000E+000 0.000000000000000E+000 0.210526315789474E+000 0.000000000000000E+000 0.000000000000000E+000 0.263157894736842E+000 0.000000000000000E+000 0.000000000000000E+000 0.315789473684211E+000 0.000000000000000E+000 0.000000000000000E+000 0.368421052631579E+000 0.000000000000000E+000 0.000000000000000E+000 0.421052631578947E+000 0.000000000000000E+000 0.000000000000000E+000 0.473684210526316E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473684E+000 0.000000000000000E+000 0.000000000000000E+000 0.578947368421053E+000 0.000000000000000E+000 0.000000000000000E+000 0.631578947368421E+000 0.000000000000000E+000 0.000000000000000E+000 0.684210526315789E+000 0.000000000000000E+000 0.000000000000000E+000 0.736842105263158E+000 0.000000000000000E+000 0.000000000000000E+000 0.789473684210526E+000 0.000000000000000E+000 0.000000000000000E+000 0.842105263157895E+000 0.000000000000000E+000 0.000000000000000E+000 0.894736842105263E+000 0.000000000000000E+000 0.000000000000000E+000 0.947368421052632E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.526315789473684E-001 -0.335632842115888E-014 0.100000000000000E+001 0.105263157894737E+000 -0.669458534826050E-014 0.100000000000000E+001 0.157894736842105E+000 -0.838302469292299E-014 0.100000000000000E+001 0.210526315789474E+000 -0.108292737615513E-013 0.100000000000000E+001 0.263157894736842E+000 -0.133483248744741E-013 0.100000000000000E+001 0.315789473684211E+000 -0.120038623780006E-013 0.100000000000000E+001 0.368421052631579E+000 -0.125388914343515E-013 0.100000000000000E+001 0.421052631578947E+000 -0.149505768732734E-013 0.100000000000000E+001 0.473684210526316E+000 -0.154238816265942E-013 0.100000000000000E+001 0.526315789473684E+000 -0.141771427689075E-013 0.100000000000000E+001 0.578947368421053E+000 -0.154250640834186E-013 0.100000000000000E+001 0.631578947368421E+000 -0.909704358978335E-014 0.100000000000000E+001 0.684210526315789E+000 -0.777059282997183E-014 0.100000000000000E+001 0.736842105263158E+000 -0.158811516519974E-013 0.100000000000000E+001 0.789473684210526E+000 -0.500112219492957E-014 0.100000000000000E+001 0.842105263157895E+000 0.592801386486082E-014 0.100000000000000E+001 0.894736842105263E+000 -0.440326475482490E-014 0.100000000000000E+001 0.947368421052632E+000 0.190785149052857E-014 0.947368421052632E+000 0.947368421052632E+000 0.187843862462701E+000 0.894736842105263E+000 0.894736842105263E+000 0.229586943009962E+000 0.842105263157895E+000 0.842105263157895E+000 0.178758603755347E+000 0.789473684210526E+000 0.789473684210526E+000 0.810306857682214E-001 0.736842105263158E+000 0.736842105263158E+000 -0.257824909262472E-001 0.684210526315789E+000 0.684210526315789E+000 -0.111724127347089E+000 0.631578947368421E+000 0.631578947368421E+000 -0.154694945557504E+000 0.578947368421053E+000 0.578947368421053E+000 -0.140453188664909E+000 0.526315789473684E+000 0.526315789473684E+000 -0.626146208208925E-001 0.473684210526316E+000 0.473684210526316E+000 0.773474727787554E-001 0.421052631578947E+000 0.421052631578947E+000 0.270102285894063E+000 0.368421052631579E+000 0.368421052631579E+000 0.498461491240859E+000 0.315789473684211E+000 0.315789473684211E+000 0.737379240490788E+000 0.263157894736842E+000 0.263157894736842E+000 0.953952164271300E+000 0.210526315789474E+000 0.210526315789474E+000 0.110741937216565E+001 0.157894736842105E+000 0.157894736842105E+000 0.114916245271292E+001 0.105263157894737E+000 0.105263157894737E+000 0.102270547340797E+001 0.526315789473685E-001 0.526315789473685E-001 0.663714980701499E+000 0.105263157894737E+000 0.526315789473684E-001 0.511352736703985E+000 0.947368421052632E+000 0.526315789473684E-001 0.104357701368132E-001 0.947368421052632E+000 0.894736842105263E+000 0.177408092325879E+000 0.157894736842105E+000 0.526315789473684E-001 0.383054150904306E+000 0.210526315789474E+000 0.526315789473684E-001 0.276854843041413E+000 0.263157894736842E+000 0.526315789473684E-001 0.190790432854260E+000 0.315789473684211E+000 0.526315789473684E-001 0.122896540081798E+000 0.368421052631579E+000 0.526315789473684E-001 0.712087844629801E-001 0.421052631578947E+000 0.526315789473684E-001 0.337627857367576E-001 0.473684210526316E+000 0.526315789473684E-001 0.859416364208372E-002 0.526315789473684E+000 0.526315789473684E-001 -0.626146208208991E-002 0.578947368421053E+000 0.526315789473684E-001 -0.127684716968105E-001 0.631578947368421E+000 0.526315789473684E-001 -0.128912454631264E-001 0.684210526315789E+000 0.526315789473684E-001 -0.859416364208470E-002 0.736842105263158E+000 0.526315789473684E-001 -0.184160649473312E-002 0.789473684210526E+000 0.526315789473684E-001 0.540204571787942E-002 0.842105263157895E+000 0.526315789473684E-001 0.111724127347071E-001 0.894736842105263E+000 0.526315789473684E-001 0.135051142947010E-001 0.947368421052632E+000 0.105263157894737E+000 0.208715402736269E-001 0.947368421052631E+000 0.157894736842105E+000 0.313073104104403E-001 0.947368421052632E+000 0.210526315789474E+000 0.417430805472531E-001 0.947368421052631E+000 0.263157894736842E+000 0.521788506840694E-001 0.947368421052632E+000 0.315789473684211E+000 0.626146208208879E-001 0.947368421052632E+000 0.368421052631579E+000 0.730503909576996E-001 0.947368421052632E+000 0.421052631578947E+000 0.834861610945178E-001 0.947368421052632E+000 0.473684210526316E+000 0.939219312313312E-001 0.947368421052632E+000 0.526315789473684E+000 0.104357701368148E+000 0.947368421052632E+000 0.578947368421053E+000 0.114793471504968E+000 0.947368421052632E+000 0.631578947368421E+000 0.125229241641782E+000 0.947368421052632E+000 0.684210526315789E+000 0.135665011778602E+000 0.947368421052632E+000 0.736842105263158E+000 0.146100781915420E+000 0.947368421052632E+000 0.789473684210526E+000 0.156536552052233E+000 0.947368421052632E+000 0.842105263157895E+000 0.166972322189056E+000 0.894736842105263E+000 0.842105263157895E+000 0.216081828715253E+000 0.842105263157895E+000 0.789473684210526E+000 0.167586191020631E+000 0.789473684210526E+000 0.736842105263158E+000 0.756286400503412E-001 0.736842105263158E+000 0.684210526315789E+000 -0.239408844315203E-001 0.684210526315789E+000 0.631578947368421E+000 -0.103129963705002E+000 0.631578947368421E+000 0.578947368421053E+000 -0.141803700094380E+000 0.578947368421053E+000 0.526315789473684E+000 -0.127684716968100E+000 0.526315789473684E+000 0.473684210526316E+000 -0.563531587388052E-001 0.473684210526316E+000 0.421052631578947E+000 0.687533091366714E-001 0.421052631578947E+000 0.368421052631579E+000 0.236339500157304E+000 0.368421052631579E+000 0.315789473684211E+000 0.427252706777880E+000 0.315789473684211E+000 0.263157894736842E+000 0.614482700408991E+000 0.263157894736842E+000 0.210526315789474E+000 0.763161731417040E+000 0.210526315789474E+000 0.157894736842105E+000 0.830564529124239E+000 0.157894736842105E+000 0.105263157894737E+000 0.766108301808611E+000 0.210526315789474E+000 0.105263157894737E+000 0.553709686082827E+000 0.894736842105263E+000 0.105263157894737E+000 0.270102285894018E-001 0.894736842105263E+000 0.789473684210526E+000 0.202576714420540E+000 0.263157894736842E+000 0.105263157894737E+000 0.381580865708520E+000 0.315789473684211E+000 0.105263157894737E+000 0.245793080163596E+000 0.368421052631579E+000 0.105263157894737E+000 0.142417568925960E+000 0.421052631578947E+000 0.105263157894737E+000 0.675255714735156E-001 0.473684210526316E+000 0.105263157894737E+000 0.171883272841672E-001 0.526315789473684E+000 0.105263157894737E+000 -0.125229241641794E-001 0.578947368421053E+000 0.105263157894737E+000 -0.255369433936213E-001 0.631578947368421E+000 0.105263157894737E+000 -0.257824909262529E-001 0.684210526315789E+000 0.105263157894737E+000 -0.171883272841695E-001 0.736842105263158E+000 0.105263157894737E+000 -0.368321298946699E-002 0.789473684210526E+000 0.105263157894737E+000 0.108040914357601E-001 0.842105263157895E+000 0.105263157894737E+000 0.223448254694135E-001 0.894736842105263E+000 0.157894736842105E+000 0.405153428841041E-001 0.894736842105263E+000 0.210526315789474E+000 0.540204571788058E-001 0.894736842105263E+000 0.263157894736842E+000 0.675255714735061E-001 0.894736842105263E+000 0.315789473684211E+000 0.810306857682093E-001 0.894736842105263E+000 0.368421052631579E+000 0.945358000629109E-001 0.894736842105263E+000 0.421052631578947E+000 0.108040914357616E+000 0.894736842105263E+000 0.473684210526316E+000 0.121546028652317E+000 0.894736842105263E+000 0.526315789473684E+000 0.135051142947023E+000 0.894736842105263E+000 0.578947368421053E+000 0.148556257241728E+000 0.894736842105263E+000 0.631578947368421E+000 0.162061371536433E+000 0.894736842105263E+000 0.684210526315789E+000 0.175566485831136E+000 0.894736842105263E+000 0.736842105263158E+000 0.189071600125840E+000 0.842105263157895E+000 0.736842105263158E+000 0.156413778285925E+000 0.789473684210526E+000 0.684210526315789E+000 0.702265943324545E-001 0.736842105263158E+000 0.631578947368421E+000 -0.220992779367857E-001 0.684210526315789E+000 0.578947368421053E+000 -0.945358000629207E-001 0.631578947368421E+000 0.526315789473684E+000 -0.128912454631259E+000 0.578947368421053E+000 0.473684210526316E+000 -0.114916245271293E+000 0.526315789473684E+000 0.421052631578947E+000 -0.500916966567176E-001 0.473684210526316E+000 0.368421052631579E+000 0.601591454945870E-001 0.421052631578947E+000 0.315789473684211E+000 0.202576714420547E+000 0.368421052631579E+000 0.263157894736842E+000 0.356043922314900E+000 0.315789473684211E+000 0.210526315789474E+000 0.491586160327192E+000 0.263157894736842E+000 0.157894736842105E+000 0.572371298562780E+000 0.315789473684211E+000 0.157894736842105E+000 0.368689620245395E+000 0.842105263157895E+000 0.157894736842105E+000 0.335172382041227E-001 0.842105263157895E+000 0.684210526315789E+000 0.145241365551214E+000 0.368421052631579E+000 0.157894736842105E+000 0.213626353388940E+000 0.421052631578947E+000 0.157894736842105E+000 0.101288357210273E+000 0.473684210526316E+000 0.157894736842105E+000 0.257824909262509E-001 0.526315789473684E+000 0.157894736842105E+000 -0.187843862462690E-001 0.578947368421053E+000 0.157894736842105E+000 -0.383054150904315E-001 0.631578947368421E+000 0.157894736842105E+000 -0.386737363893783E-001 0.684210526315790E+000 0.157894736842105E+000 -0.257824909262542E-001 0.736842105263158E+000 0.157894736842105E+000 -0.552481948419964E-002 0.789473684210526E+000 0.157894736842105E+000 0.162061371536397E-001 0.842105263157895E+000 0.210526315789474E+000 0.446896509388300E-001 0.842105263157895E+000 0.263157894736842E+000 0.558620636735385E-001 0.842105263157895E+000 0.315789473684210E+000 0.670344764082476E-001 0.842105263157895E+000 0.368421052631579E+000 0.782068891429539E-001 0.842105263157895E+000 0.421052631578947E+000 0.893793018776623E-001 0.842105263157894E+000 0.473684210526316E+000 0.100551714612371E+000 0.842105263157894E+000 0.526315789473684E+000 0.111724127347085E+000 0.842105263157894E+000 0.578947368421052E+000 0.122896540081794E+000 0.842105263157894E+000 0.631578947368421E+000 0.134068952816502E+000 0.789473684210526E+000 0.631578947368421E+000 0.648245486145755E-001 0.736842105263158E+000 0.578947368421053E+000 -0.202576714420575E-001 0.684210526315789E+000 0.526315789473684E+000 -0.859416364208423E-001 0.631578947368421E+000 0.473684210526316E+000 -0.116021209168132E+000 0.578947368421053E+000 0.421052631578947E+000 -0.102147773574481E+000 0.526315789473684E+000 0.368421052631579E+000 -0.438302345746273E-001 0.473684210526316E+000 0.315789473684211E+000 0.515649818525027E-001 0.421052631578947E+000 0.263157894736842E+000 0.168813928683788E+000 0.368421052631579E+000 0.210526315789474E+000 0.284835137851919E+000 0.421052631578947E+000 0.210526315789474E+000 0.135051142947031E+000 0.789473684210526E+000 0.210526315789474E+000 0.216081828715207E-001 0.789473684210526E+000 0.578947368421053E+000 0.594225028966872E-001 0.473684210526316E+000 0.210526315789474E+000 0.343766545683350E-001 0.526315789473684E+000 0.210526315789474E+000 -0.250458483283590E-001 0.578947368421053E+000 0.210526315789474E+000 -0.510738867872418E-001 0.631578947368421E+000 0.210526315789474E+000 -0.515649818525047E-001 0.684210526315789E+000 0.210526315789474E+000 -0.343766545683386E-001 0.736842105263158E+000 0.210526315789474E+000 -0.736642597893264E-002 0.789473684210526E+000 0.263157894736842E+000 0.270102285894003E-001 0.789473684210526E+000 0.315789473684211E+000 0.324122743072828E-001 0.789473684210526E+000 0.368421052631579E+000 0.378143200251616E-001 0.789473684210526E+000 0.421052631578947E+000 0.432163657430450E-001 0.789473684210526E+000 0.473684210526316E+000 0.486184114609262E-001 0.789473684210526E+000 0.526315789473684E+000 0.540204571788093E-001 0.736842105263158E+000 0.526315789473684E+000 -0.184160649473268E-001 0.684210526315789E+000 0.473684210526316E+000 -0.773474727787561E-001 0.631578947368421E+000 0.421052631578947E+000 -0.103129963705007E+000 0.578947368421053E+000 0.368421052631579E+000 -0.893793018776738E-001 0.526315789473684E+000 0.315789473684211E+000 -0.375687724925383E-001 0.473684210526316E+000 0.263157894736842E+000 0.429708182104187E-001 0.526315789473684E+000 0.263157894736842E+000 -0.313073104104493E-001 0.736842105263158E+000 0.263157894736842E+000 -0.920803247366572E-002 0.736842105263158E+000 0.473684210526316E+000 -0.165744584525939E-001 0.578947368421053E+000 0.263157894736842E+000 -0.638423584840526E-001 0.631578947368421E+000 0.263157894736842E+000 -0.644562273156310E-001 0.684210526315789E+000 0.263157894736842E+000 -0.429708182104221E-001 0.736842105263158E+000 0.315789473684211E+000 -0.110496389683974E-001 0.736842105263158E+000 0.368421052631579E+000 -0.128912454631291E-001 0.736842105263158E+000 0.421052631578947E+000 -0.147328519578616E-001 0.684210526315789E+000 0.421052631578947E+000 -0.687533091366731E-001 0.631578947368421E+000 0.368421052631579E+000 -0.902387182418813E-001 0.578947368421053E+000 0.315789473684211E+000 -0.766108301808625E-001 0.631578947368421E+000 0.315789473684211E+000 -0.773474727787555E-001 0.684210526315789E+000 0.315789473684211E+000 -0.515649818525051E-001 0.684210526315789E+000 0.368421052631579E+000 -0.601591454945890E-001 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.100000000000000E+001 -0.710542735760100E-014 0.000000000000000E+000 0.100000000000000E+001 0.000000000000000E+000 0.526315789473684E-001 0.526315789473684E-001 0.663714980701499E+000 0.105263157894737E+000 0.105263157894737E+000 0.102270547340797E+001 0.157894736842105E+000 0.157894736842105E+000 0.114916245271292E+001 0.210526315789474E+000 0.210526315789474E+000 0.110741937216565E+001 0.263157894736842E+000 0.263157894736842E+000 0.953952164271299E+000 0.315789473684211E+000 0.315789473684211E+000 0.737379240490788E+000 0.368421052631579E+000 0.368421052631579E+000 0.498461491240859E+000 0.421052631578947E+000 0.421052631578947E+000 0.270102285894062E+000 0.473684210526316E+000 0.473684210526316E+000 0.773474727787545E-001 0.526315789473684E+000 0.526315789473684E+000 -0.626146208208977E-001 0.578947368421053E+000 0.578947368421053E+000 -0.140453188664912E+000 0.631578947368421E+000 0.631578947368421E+000 -0.154694945557507E+000 0.684210526315789E+000 0.684210526315789E+000 -0.111724127347092E+000 0.736842105263158E+000 0.736842105263158E+000 -0.257824909262502E-001 0.789473684210526E+000 0.789473684210526E+000 0.810306857682143E-001 0.842105263157895E+000 0.842105263157895E+000 0.178758603755340E+000 0.894736842105263E+000 0.894736842105263E+000 0.229586943009948E+000 0.947368421052632E+000 0.947368421052632E+000 0.187843862462687E+000 0.947368421052632E+000 0.100000000000000E+001 -0.275066320170065E-014 0.894736842105263E+000 0.100000000000000E+001 -0.625171681600774E-014 0.842105263157895E+000 0.100000000000000E+001 -0.696130378929570E-014 0.789473684210526E+000 0.100000000000000E+001 -0.801051002558290E-014 0.736842105263158E+000 0.100000000000000E+001 -0.837290748484990E-014 0.684210526315789E+000 0.100000000000000E+001 -0.910146332033464E-014 0.631578947368421E+000 0.100000000000000E+001 -0.383613301798740E-014 0.578947368421053E+000 0.100000000000000E+001 -0.635589512425176E-014 0.526315789473684E+000 0.100000000000000E+001 -0.439347342165806E-014 0.473684210526316E+000 0.100000000000000E+001 -0.152775239134603E-014 0.421052631578947E+000 0.100000000000000E+001 -0.460124960064628E-014 0.368421052631579E+000 0.100000000000000E+001 -0.181171468381062E-014 0.315789473684211E+000 0.100000000000000E+001 -0.156229694172545E-016 0.263157894736842E+000 0.100000000000000E+001 -0.193159604140092E-014 0.210526315789474E+000 0.100000000000000E+001 -0.140345016731891E-014 0.157894736842105E+000 0.100000000000000E+001 -0.175588363882030E-014 0.105263157894737E+000 0.100000000000000E+001 -0.547413900127149E-015 0.526315789473685E-001 0.100000000000000E+001 -0.154503716127639E-015 0.000000000000000E+000 0.947368421052632E+000 0.000000000000000E+000 0.000000000000000E+000 0.894736842105263E+000 0.000000000000000E+000 0.000000000000000E+000 0.842105263157895E+000 0.000000000000000E+000 0.000000000000000E+000 0.789473684210526E+000 0.000000000000000E+000 0.000000000000000E+000 0.736842105263158E+000 0.000000000000000E+000 0.000000000000000E+000 0.684210526315789E+000 0.000000000000000E+000 0.000000000000000E+000 0.631578947368421E+000 0.000000000000000E+000 0.000000000000000E+000 0.578947368421053E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473684E+000 0.000000000000000E+000 0.000000000000000E+000 0.473684210526316E+000 0.000000000000000E+000 0.000000000000000E+000 0.421052631578947E+000 0.000000000000000E+000 0.000000000000000E+000 0.368421052631579E+000 0.000000000000000E+000 0.000000000000000E+000 0.315789473684211E+000 0.000000000000000E+000 0.000000000000000E+000 0.263157894736842E+000 0.000000000000000E+000 0.000000000000000E+000 0.210526315789474E+000 0.000000000000000E+000 0.000000000000000E+000 0.157894736842105E+000 0.000000000000000E+000 0.000000000000000E+000 0.105263157894737E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473685E-001 0.000000000000000E+000 0.526315789473684E-001 0.105263157894737E+000 0.511352736703985E+000 0.894736842105263E+000 0.947368421052632E+000 0.177408092325867E+000 0.526315789473684E-001 0.947368421052632E+000 0.104357701368158E-001 0.105263157894737E+000 0.157894736842105E+000 0.766108301808611E+000 0.157894736842105E+000 0.210526315789474E+000 0.830564529124240E+000 0.210526315789474E+000 0.263157894736842E+000 0.763161731417040E+000 0.263157894736842E+000 0.315789473684211E+000 0.614482700408990E+000 0.315789473684211E+000 0.368421052631579E+000 0.427252706777879E+000 0.368421052631579E+000 0.421052631578947E+000 0.236339500157304E+000 0.421052631578947E+000 0.473684210526316E+000 0.687533091366704E-001 0.473684210526316E+000 0.526315789473684E+000 -0.563531587388063E-001 0.526315789473684E+000 0.578947368421053E+000 -0.127684716968104E+000 0.578947368421053E+000 0.631578947368421E+000 -0.141803700094382E+000 0.631578947368421E+000 0.684210526315789E+000 -0.103129963705005E+000 0.684210526315789E+000 0.736842105263158E+000 -0.239408844315222E-001 0.736842105263158E+000 0.789473684210526E+000 0.756286400503296E-001 0.789473684210526E+000 0.842105263157895E+000 0.167586191020629E+000 0.842105263157895E+000 0.894736842105263E+000 0.216081828715246E+000 0.842105263157895E+000 0.947368421052632E+000 0.166972322189051E+000 0.789473684210526E+000 0.947368421052631E+000 0.156536552052236E+000 0.736842105263158E+000 0.947368421052632E+000 0.146100781915420E+000 0.684210526315789E+000 0.947368421052631E+000 0.135665011778603E+000 0.631578947368421E+000 0.947368421052632E+000 0.125229241641791E+000 0.578947368421053E+000 0.947368421052632E+000 0.114793471504970E+000 0.526315789473684E+000 0.947368421052632E+000 0.104357701368157E+000 0.473684210526316E+000 0.947368421052632E+000 0.939219312313410E-001 0.421052631578947E+000 0.947368421052632E+000 0.834861610945276E-001 0.368421052631579E+000 0.947368421052632E+000 0.730503909577098E-001 0.315789473684211E+000 0.947368421052632E+000 0.626146208208925E-001 0.263157894736842E+000 0.947368421052632E+000 0.521788506840807E-001 0.210526315789474E+000 0.947368421052632E+000 0.417430805472624E-001 0.157894736842105E+000 0.947368421052632E+000 0.313073104104465E-001 0.105263157894737E+000 0.947368421052632E+000 0.208715402736322E-001 0.526315789473684E-001 0.894736842105263E+000 0.135051142947032E-001 0.526315789473684E-001 0.842105263157895E+000 0.111724127347090E-001 0.526315789473684E-001 0.789473684210526E+000 0.540204571788133E-002 0.526315789473684E-001 0.736842105263158E+000 -0.184160649473233E-002 0.526315789473684E-001 0.684210526315789E+000 -0.859416364208426E-002 0.526315789473684E-001 0.631578947368421E+000 -0.128912454631264E-001 0.526315789473684E-001 0.578947368421053E+000 -0.127684716968104E-001 0.526315789473684E-001 0.526315789473684E+000 -0.626146208208981E-002 0.526315789473684E-001 0.473684210526316E+000 0.859416364208368E-002 0.526315789473684E-001 0.421052631578947E+000 0.337627857367574E-001 0.526315789473684E-001 0.368421052631579E+000 0.712087844629798E-001 0.526315789473684E-001 0.315789473684211E+000 0.122896540081798E+000 0.526315789473684E-001 0.263157894736842E+000 0.190790432854260E+000 0.526315789473684E-001 0.210526315789474E+000 0.276854843041413E+000 0.526315789473684E-001 0.157894736842105E+000 0.383054150904306E+000 0.105263157894737E+000 0.210526315789474E+000 0.553709686082826E+000 0.789473684210526E+000 0.894736842105263E+000 0.202576714420540E+000 0.105263157894737E+000 0.894736842105263E+000 0.270102285894060E-001 0.157894736842105E+000 0.263157894736842E+000 0.572371298562780E+000 0.210526315789474E+000 0.315789473684211E+000 0.491586160327192E+000 0.263157894736842E+000 0.368421052631579E+000 0.356043922314899E+000 0.315789473684211E+000 0.421052631578947E+000 0.202576714420546E+000 0.368421052631579E+000 0.473684210526316E+000 0.601591454945855E-001 0.421052631578947E+000 0.526315789473684E+000 -0.500916966567174E-001 0.473684210526316E+000 0.578947368421053E+000 -0.114916245271292E+000 0.526315789473684E+000 0.631578947368421E+000 -0.128912454631256E+000 0.578947368421053E+000 0.684210526315789E+000 -0.945358000629234E-001 0.631578947368421E+000 0.736842105263158E+000 -0.220992779367877E-001 0.684210526315789E+000 0.789473684210526E+000 0.702265943324503E-001 0.736842105263158E+000 0.842105263157895E+000 0.156413778285921E+000 0.736842105263158E+000 0.894736842105263E+000 0.189071600125843E+000 0.684210526315789E+000 0.894736842105263E+000 0.175566485831134E+000 0.631578947368421E+000 0.894736842105263E+000 0.162061371536433E+000 0.578947368421053E+000 0.894736842105263E+000 0.148556257241731E+000 0.526315789473684E+000 0.894736842105263E+000 0.135051142947025E+000 0.473684210526316E+000 0.894736842105263E+000 0.121546028652326E+000 0.421052631578947E+000 0.894736842105263E+000 0.108040914357620E+000 0.368421052631579E+000 0.894736842105263E+000 0.945358000629183E-001 0.315789473684211E+000 0.894736842105263E+000 0.810306857682160E-001 0.263157894736842E+000 0.894736842105263E+000 0.675255714735138E-001 0.210526315789474E+000 0.894736842105263E+000 0.540204571788117E-001 0.157894736842105E+000 0.894736842105263E+000 0.405153428841102E-001 0.105263157894737E+000 0.842105263157895E+000 0.223448254694163E-001 0.105263157894737E+000 0.789473684210526E+000 0.108040914357621E-001 0.105263157894737E+000 0.736842105263158E+000 -0.368321298946501E-002 0.105263157894737E+000 0.684210526315789E+000 -0.171883272841687E-001 0.105263157894737E+000 0.631578947368421E+000 -0.257824909262516E-001 0.105263157894737E+000 0.578947368421053E+000 -0.255369433936213E-001 0.105263157894737E+000 0.526315789473684E+000 -0.125229241641798E-001 0.105263157894737E+000 0.473684210526316E+000 0.171883272841669E-001 0.105263157894737E+000 0.421052631578947E+000 0.675255714735150E-001 0.105263157894737E+000 0.368421052631579E+000 0.142417568925959E+000 0.105263157894737E+000 0.315789473684211E+000 0.245793080163596E+000 0.105263157894737E+000 0.263157894736842E+000 0.381580865708520E+000 0.157894736842105E+000 0.315789473684211E+000 0.368689620245394E+000 0.684210526315789E+000 0.842105263157895E+000 0.145241365551209E+000 0.157894736842105E+000 0.842105263157895E+000 0.335172382041257E-001 0.210526315789474E+000 0.368421052631579E+000 0.284835137851919E+000 0.263157894736842E+000 0.421052631578947E+000 0.168813928683788E+000 0.315789473684211E+000 0.473684210526316E+000 0.515649818525023E-001 0.368421052631579E+000 0.526315789473684E+000 -0.438302345746280E-001 0.421052631578947E+000 0.578947368421053E+000 -0.102147773574482E+000 0.473684210526316E+000 0.631578947368421E+000 -0.116021209168131E+000 0.526315789473684E+000 0.684210526315790E+000 -0.859416364208374E-001 0.578947368421053E+000 0.736842105263158E+000 -0.202576714420559E-001 0.631578947368421E+000 0.789473684210526E+000 0.648245486145733E-001 0.631578947368421E+000 0.842105263157895E+000 0.134068952816504E+000 0.578947368421053E+000 0.842105263157895E+000 0.122896540081796E+000 0.526315789473684E+000 0.842105263157895E+000 0.111724127347085E+000 0.473684210526316E+000 0.842105263157895E+000 0.100551714612378E+000 0.421052631578947E+000 0.842105263157895E+000 0.893793018776687E-001 0.368421052631579E+000 0.842105263157894E+000 0.782068891429586E-001 0.315789473684210E+000 0.842105263157894E+000 0.670344764082518E-001 0.263157894736842E+000 0.842105263157894E+000 0.558620636735447E-001 0.210526315789474E+000 0.842105263157894E+000 0.446896509388334E-001 0.157894736842105E+000 0.789473684210526E+000 0.162061371536442E-001 0.157894736842105E+000 0.736842105263158E+000 -0.552481948419794E-002 0.157894736842105E+000 0.684210526315789E+000 -0.257824909262523E-001 0.157894736842105E+000 0.631578947368421E+000 -0.386737363893783E-001 0.157894736842105E+000 0.578947368421053E+000 -0.383054150904309E-001 0.157894736842105E+000 0.526315789473684E+000 -0.187843862462687E-001 0.157894736842105E+000 0.473684210526316E+000 0.257824909262509E-001 0.157894736842105E+000 0.421052631578947E+000 0.101288357210273E+000 0.157894736842105E+000 0.368421052631579E+000 0.213626353388940E+000 0.210526315789474E+000 0.421052631578947E+000 0.135051142947031E+000 0.578947368421053E+000 0.789473684210526E+000 0.594225028966916E-001 0.210526315789474E+000 0.789473684210526E+000 0.216081828715228E-001 0.263157894736842E+000 0.473684210526316E+000 0.429708182104187E-001 0.315789473684211E+000 0.526315789473684E+000 -0.375687724925381E-001 0.368421052631579E+000 0.578947368421053E+000 -0.893793018776729E-001 0.421052631578947E+000 0.631578947368421E+000 -0.103129963705006E+000 0.473684210526316E+000 0.684210526315789E+000 -0.773474727787563E-001 0.526315789473684E+000 0.736842105263158E+000 -0.184160649473255E-001 0.526315789473684E+000 0.789473684210526E+000 0.540204571788078E-001 0.473684210526316E+000 0.789473684210526E+000 0.486184114609305E-001 0.421052631578947E+000 0.789473684210526E+000 0.432163657430473E-001 0.368421052631579E+000 0.789473684210526E+000 0.378143200251658E-001 0.315789473684211E+000 0.789473684210526E+000 0.324122743072871E-001 0.263157894736842E+000 0.789473684210526E+000 0.270102285894058E-001 0.210526315789474E+000 0.736842105263158E+000 -0.736642597892969E-002 0.210526315789474E+000 0.684210526315789E+000 -0.343766545683364E-001 0.210526315789474E+000 0.631578947368421E+000 -0.515649818525033E-001 0.210526315789474E+000 0.578947368421053E+000 -0.510738867872420E-001 0.210526315789474E+000 0.526315789473684E+000 -0.250458483283590E-001 0.210526315789474E+000 0.473684210526316E+000 0.343766545683351E-001 0.263157894736842E+000 0.526315789473684E+000 -0.313073104104490E-001 0.473684210526316E+000 0.736842105263158E+000 -0.165744584525923E-001 0.263157894736842E+000 0.736842105263158E+000 -0.920803247366310E-002 0.315789473684211E+000 0.578947368421053E+000 -0.766108301808619E-001 0.368421052631579E+000 0.631578947368421E+000 -0.902387182418808E-001 0.421052631578947E+000 0.684210526315789E+000 -0.687533091366704E-001 0.421052631578947E+000 0.736842105263158E+000 -0.147328519578588E-001 0.368421052631579E+000 0.736842105263158E+000 -0.128912454631264E-001 0.315789473684211E+000 0.736842105263158E+000 -0.110496389683955E-001 0.263157894736842E+000 0.684210526315789E+000 -0.429708182104198E-001 0.263157894736842E+000 0.631578947368421E+000 -0.644562273156300E-001 0.263157894736842E+000 0.578947368421053E+000 -0.638423584840521E-001 0.315789473684211E+000 0.631578947368421E+000 -0.773474727787542E-001 0.368421052631579E+000 0.684210526315789E+000 -0.601591454945875E-001 0.315789473684211E+000 0.684210526315789E+000 -0.515649818525032E-001 + + + + + + + + 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.710542735760100E-014 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 -0.335632842115888E-014 0.000000000000000E+000 0.000000000000000E+000 -0.669458534826050E-014 0.000000000000000E+000 0.000000000000000E+000 -0.838302469292299E-014 0.000000000000000E+000 0.000000000000000E+000 -0.108292737615513E-013 0.000000000000000E+000 0.000000000000000E+000 -0.133483248744741E-013 0.000000000000000E+000 0.000000000000000E+000 -0.120038623780006E-013 0.000000000000000E+000 0.000000000000000E+000 -0.125388914343515E-013 0.000000000000000E+000 0.000000000000000E+000 -0.149505768732734E-013 0.000000000000000E+000 0.000000000000000E+000 -0.154238816265942E-013 0.000000000000000E+000 0.000000000000000E+000 -0.141771427689075E-013 0.000000000000000E+000 0.000000000000000E+000 -0.154250640834186E-013 0.000000000000000E+000 0.000000000000000E+000 -0.909704358978335E-014 0.000000000000000E+000 0.000000000000000E+000 -0.777059282997183E-014 0.000000000000000E+000 0.000000000000000E+000 -0.158811516519974E-013 0.000000000000000E+000 0.000000000000000E+000 -0.500112219492957E-014 0.000000000000000E+000 0.000000000000000E+000 0.592801386486082E-014 0.000000000000000E+000 0.000000000000000E+000 -0.440326475482490E-014 0.000000000000000E+000 0.000000000000000E+000 0.190785149052857E-014 0.000000000000000E+000 0.000000000000000E+000 0.187843862462701E+000 0.000000000000000E+000 0.000000000000000E+000 0.229586943009962E+000 0.000000000000000E+000 0.000000000000000E+000 0.178758603755347E+000 0.000000000000000E+000 0.000000000000000E+000 0.810306857682214E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262472E-001 0.000000000000000E+000 0.000000000000000E+000 -0.111724127347089E+000 0.000000000000000E+000 0.000000000000000E+000 -0.154694945557504E+000 0.000000000000000E+000 0.000000000000000E+000 -0.140453188664909E+000 0.000000000000000E+000 0.000000000000000E+000 -0.626146208208925E-001 0.000000000000000E+000 0.000000000000000E+000 0.773474727787554E-001 0.000000000000000E+000 0.000000000000000E+000 0.270102285894063E+000 0.000000000000000E+000 0.000000000000000E+000 0.498461491240859E+000 0.000000000000000E+000 0.000000000000000E+000 0.737379240490788E+000 0.000000000000000E+000 0.000000000000000E+000 0.953952164271300E+000 0.000000000000000E+000 0.000000000000000E+000 0.110741937216565E+001 0.000000000000000E+000 0.000000000000000E+000 0.114916245271292E+001 0.000000000000000E+000 0.000000000000000E+000 0.102270547340797E+001 0.000000000000000E+000 0.000000000000000E+000 0.663714980701499E+000 0.000000000000000E+000 0.000000000000000E+000 0.511352736703985E+000 0.000000000000000E+000 0.000000000000000E+000 0.104357701368132E-001 0.000000000000000E+000 0.000000000000000E+000 0.177408092325879E+000 0.000000000000000E+000 0.000000000000000E+000 0.383054150904306E+000 0.000000000000000E+000 0.000000000000000E+000 0.276854843041413E+000 0.000000000000000E+000 0.000000000000000E+000 0.190790432854260E+000 0.000000000000000E+000 0.000000000000000E+000 0.122896540081798E+000 0.000000000000000E+000 0.000000000000000E+000 0.712087844629801E-001 0.000000000000000E+000 0.000000000000000E+000 0.337627857367576E-001 0.000000000000000E+000 0.000000000000000E+000 0.859416364208372E-002 0.000000000000000E+000 0.000000000000000E+000 -0.626146208208991E-002 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968105E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631264E-001 0.000000000000000E+000 0.000000000000000E+000 -0.859416364208470E-002 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473312E-002 0.000000000000000E+000 0.000000000000000E+000 0.540204571787942E-002 0.000000000000000E+000 0.000000000000000E+000 0.111724127347071E-001 0.000000000000000E+000 0.000000000000000E+000 0.135051142947010E-001 0.000000000000000E+000 0.000000000000000E+000 0.208715402736269E-001 0.000000000000000E+000 0.000000000000000E+000 0.313073104104403E-001 0.000000000000000E+000 0.000000000000000E+000 0.417430805472531E-001 0.000000000000000E+000 0.000000000000000E+000 0.521788506840694E-001 0.000000000000000E+000 0.000000000000000E+000 0.626146208208879E-001 0.000000000000000E+000 0.000000000000000E+000 0.730503909576996E-001 0.000000000000000E+000 0.000000000000000E+000 0.834861610945178E-001 0.000000000000000E+000 0.000000000000000E+000 0.939219312313312E-001 0.000000000000000E+000 0.000000000000000E+000 0.104357701368148E+000 0.000000000000000E+000 0.000000000000000E+000 0.114793471504968E+000 0.000000000000000E+000 0.000000000000000E+000 0.125229241641782E+000 0.000000000000000E+000 0.000000000000000E+000 0.135665011778602E+000 0.000000000000000E+000 0.000000000000000E+000 0.146100781915420E+000 0.000000000000000E+000 0.000000000000000E+000 0.156536552052233E+000 0.000000000000000E+000 0.000000000000000E+000 0.166972322189056E+000 0.000000000000000E+000 0.000000000000000E+000 0.216081828715253E+000 0.000000000000000E+000 0.000000000000000E+000 0.167586191020631E+000 0.000000000000000E+000 0.000000000000000E+000 0.756286400503412E-001 0.000000000000000E+000 0.000000000000000E+000 -0.239408844315203E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705002E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094380E+000 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968100E+000 0.000000000000000E+000 0.000000000000000E+000 -0.563531587388052E-001 0.000000000000000E+000 0.000000000000000E+000 0.687533091366714E-001 0.000000000000000E+000 0.000000000000000E+000 0.236339500157304E+000 0.000000000000000E+000 0.000000000000000E+000 0.427252706777880E+000 0.000000000000000E+000 0.000000000000000E+000 0.614482700408991E+000 0.000000000000000E+000 0.000000000000000E+000 0.763161731417040E+000 0.000000000000000E+000 0.000000000000000E+000 0.830564529124239E+000 0.000000000000000E+000 0.000000000000000E+000 0.766108301808611E+000 0.000000000000000E+000 0.000000000000000E+000 0.553709686082827E+000 0.000000000000000E+000 0.000000000000000E+000 0.270102285894018E-001 0.000000000000000E+000 0.000000000000000E+000 0.202576714420540E+000 0.000000000000000E+000 0.000000000000000E+000 0.381580865708520E+000 0.000000000000000E+000 0.000000000000000E+000 0.245793080163596E+000 0.000000000000000E+000 0.000000000000000E+000 0.142417568925960E+000 0.000000000000000E+000 0.000000000000000E+000 0.675255714735156E-001 0.000000000000000E+000 0.000000000000000E+000 0.171883272841672E-001 0.000000000000000E+000 0.000000000000000E+000 -0.125229241641794E-001 0.000000000000000E+000 0.000000000000000E+000 -0.255369433936213E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262529E-001 0.000000000000000E+000 0.000000000000000E+000 -0.171883272841695E-001 0.000000000000000E+000 0.000000000000000E+000 -0.368321298946699E-002 0.000000000000000E+000 0.000000000000000E+000 0.108040914357601E-001 0.000000000000000E+000 0.000000000000000E+000 0.223448254694135E-001 0.000000000000000E+000 0.000000000000000E+000 0.405153428841041E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788058E-001 0.000000000000000E+000 0.000000000000000E+000 0.675255714735061E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857682093E-001 0.000000000000000E+000 0.000000000000000E+000 0.945358000629109E-001 0.000000000000000E+000 0.000000000000000E+000 0.108040914357616E+000 0.000000000000000E+000 0.000000000000000E+000 0.121546028652317E+000 0.000000000000000E+000 0.000000000000000E+000 0.135051142947023E+000 0.000000000000000E+000 0.000000000000000E+000 0.148556257241728E+000 0.000000000000000E+000 0.000000000000000E+000 0.162061371536433E+000 0.000000000000000E+000 0.000000000000000E+000 0.175566485831136E+000 0.000000000000000E+000 0.000000000000000E+000 0.189071600125840E+000 0.000000000000000E+000 0.000000000000000E+000 0.156413778285925E+000 0.000000000000000E+000 0.000000000000000E+000 0.702265943324545E-001 0.000000000000000E+000 0.000000000000000E+000 -0.220992779367857E-001 0.000000000000000E+000 0.000000000000000E+000 -0.945358000629207E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631259E+000 0.000000000000000E+000 0.000000000000000E+000 -0.114916245271293E+000 0.000000000000000E+000 0.000000000000000E+000 -0.500916966567176E-001 0.000000000000000E+000 0.000000000000000E+000 0.601591454945870E-001 0.000000000000000E+000 0.000000000000000E+000 0.202576714420547E+000 0.000000000000000E+000 0.000000000000000E+000 0.356043922314900E+000 0.000000000000000E+000 0.000000000000000E+000 0.491586160327192E+000 0.000000000000000E+000 0.000000000000000E+000 0.572371298562780E+000 0.000000000000000E+000 0.000000000000000E+000 0.368689620245395E+000 0.000000000000000E+000 0.000000000000000E+000 0.335172382041227E-001 0.000000000000000E+000 0.000000000000000E+000 0.145241365551214E+000 0.000000000000000E+000 0.000000000000000E+000 0.213626353388940E+000 0.000000000000000E+000 0.000000000000000E+000 0.101288357210273E+000 0.000000000000000E+000 0.000000000000000E+000 0.257824909262509E-001 0.000000000000000E+000 0.000000000000000E+000 -0.187843862462690E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904315E-001 0.000000000000000E+000 0.000000000000000E+000 -0.386737363893783E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262542E-001 0.000000000000000E+000 0.000000000000000E+000 -0.552481948419964E-002 0.000000000000000E+000 0.000000000000000E+000 0.162061371536397E-001 0.000000000000000E+000 0.000000000000000E+000 0.446896509388300E-001 0.000000000000000E+000 0.000000000000000E+000 0.558620636735385E-001 0.000000000000000E+000 0.000000000000000E+000 0.670344764082476E-001 0.000000000000000E+000 0.000000000000000E+000 0.782068891429539E-001 0.000000000000000E+000 0.000000000000000E+000 0.893793018776623E-001 0.000000000000000E+000 0.000000000000000E+000 0.100551714612371E+000 0.000000000000000E+000 0.000000000000000E+000 0.111724127347085E+000 0.000000000000000E+000 0.000000000000000E+000 0.122896540081794E+000 0.000000000000000E+000 0.000000000000000E+000 0.134068952816502E+000 0.000000000000000E+000 0.000000000000000E+000 0.648245486145755E-001 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420575E-001 0.000000000000000E+000 0.000000000000000E+000 -0.859416364208423E-001 0.000000000000000E+000 0.000000000000000E+000 -0.116021209168132E+000 0.000000000000000E+000 0.000000000000000E+000 -0.102147773574481E+000 0.000000000000000E+000 0.000000000000000E+000 -0.438302345746273E-001 0.000000000000000E+000 0.000000000000000E+000 0.515649818525027E-001 0.000000000000000E+000 0.000000000000000E+000 0.168813928683788E+000 0.000000000000000E+000 0.000000000000000E+000 0.284835137851919E+000 0.000000000000000E+000 0.000000000000000E+000 0.135051142947031E+000 0.000000000000000E+000 0.000000000000000E+000 0.216081828715207E-001 0.000000000000000E+000 0.000000000000000E+000 0.594225028966872E-001 0.000000000000000E+000 0.000000000000000E+000 0.343766545683350E-001 0.000000000000000E+000 0.000000000000000E+000 -0.250458483283590E-001 0.000000000000000E+000 0.000000000000000E+000 -0.510738867872418E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525047E-001 0.000000000000000E+000 0.000000000000000E+000 -0.343766545683386E-001 0.000000000000000E+000 0.000000000000000E+000 -0.736642597893264E-002 0.000000000000000E+000 0.000000000000000E+000 0.270102285894003E-001 0.000000000000000E+000 0.000000000000000E+000 0.324122743072828E-001 0.000000000000000E+000 0.000000000000000E+000 0.378143200251616E-001 0.000000000000000E+000 0.000000000000000E+000 0.432163657430450E-001 0.000000000000000E+000 0.000000000000000E+000 0.486184114609262E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788093E-001 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473268E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787561E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705007E+000 0.000000000000000E+000 0.000000000000000E+000 -0.893793018776738E-001 0.000000000000000E+000 0.000000000000000E+000 -0.375687724925383E-001 0.000000000000000E+000 0.000000000000000E+000 0.429708182104187E-001 0.000000000000000E+000 0.000000000000000E+000 -0.313073104104493E-001 0.000000000000000E+000 0.000000000000000E+000 -0.920803247366572E-002 0.000000000000000E+000 0.000000000000000E+000 -0.165744584525939E-001 0.000000000000000E+000 0.000000000000000E+000 -0.638423584840526E-001 0.000000000000000E+000 0.000000000000000E+000 -0.644562273156310E-001 0.000000000000000E+000 0.000000000000000E+000 -0.429708182104221E-001 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683974E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631291E-001 0.000000000000000E+000 0.000000000000000E+000 -0.147328519578616E-001 0.000000000000000E+000 0.000000000000000E+000 -0.687533091366731E-001 0.000000000000000E+000 0.000000000000000E+000 -0.902387182418813E-001 0.000000000000000E+000 0.000000000000000E+000 -0.766108301808625E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787555E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525051E-001 0.000000000000000E+000 0.000000000000000E+000 -0.601591454945890E-001 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 -0.710542735760100E-014 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.663714980701499E+000 0.000000000000000E+000 0.000000000000000E+000 0.102270547340797E+001 0.000000000000000E+000 0.000000000000000E+000 0.114916245271292E+001 0.000000000000000E+000 0.000000000000000E+000 0.110741937216565E+001 0.000000000000000E+000 0.000000000000000E+000 0.953952164271299E+000 0.000000000000000E+000 0.000000000000000E+000 0.737379240490788E+000 0.000000000000000E+000 0.000000000000000E+000 0.498461491240859E+000 0.000000000000000E+000 0.000000000000000E+000 0.270102285894062E+000 0.000000000000000E+000 0.000000000000000E+000 0.773474727787545E-001 0.000000000000000E+000 0.000000000000000E+000 -0.626146208208977E-001 0.000000000000000E+000 0.000000000000000E+000 -0.140453188664912E+000 0.000000000000000E+000 0.000000000000000E+000 -0.154694945557507E+000 0.000000000000000E+000 0.000000000000000E+000 -0.111724127347092E+000 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262502E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857682143E-001 0.000000000000000E+000 0.000000000000000E+000 0.178758603755340E+000 0.000000000000000E+000 0.000000000000000E+000 0.229586943009948E+000 0.000000000000000E+000 0.000000000000000E+000 0.187843862462687E+000 0.000000000000000E+000 0.000000000000000E+000 -0.275066320170065E-014 0.000000000000000E+000 0.000000000000000E+000 -0.625171681600774E-014 0.000000000000000E+000 0.000000000000000E+000 -0.696130378929570E-014 0.000000000000000E+000 0.000000000000000E+000 -0.801051002558290E-014 0.000000000000000E+000 0.000000000000000E+000 -0.837290748484990E-014 0.000000000000000E+000 0.000000000000000E+000 -0.910146332033464E-014 0.000000000000000E+000 0.000000000000000E+000 -0.383613301798740E-014 0.000000000000000E+000 0.000000000000000E+000 -0.635589512425176E-014 0.000000000000000E+000 0.000000000000000E+000 -0.439347342165806E-014 0.000000000000000E+000 0.000000000000000E+000 -0.152775239134603E-014 0.000000000000000E+000 0.000000000000000E+000 -0.460124960064628E-014 0.000000000000000E+000 0.000000000000000E+000 -0.181171468381062E-014 0.000000000000000E+000 0.000000000000000E+000 -0.156229694172545E-016 0.000000000000000E+000 0.000000000000000E+000 -0.193159604140092E-014 0.000000000000000E+000 0.000000000000000E+000 -0.140345016731891E-014 0.000000000000000E+000 0.000000000000000E+000 -0.175588363882030E-014 0.000000000000000E+000 0.000000000000000E+000 -0.547413900127149E-015 0.000000000000000E+000 0.000000000000000E+000 -0.154503716127639E-015 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.511352736703985E+000 0.000000000000000E+000 0.000000000000000E+000 0.177408092325867E+000 0.000000000000000E+000 0.000000000000000E+000 0.104357701368158E-001 0.000000000000000E+000 0.000000000000000E+000 0.766108301808611E+000 0.000000000000000E+000 0.000000000000000E+000 0.830564529124240E+000 0.000000000000000E+000 0.000000000000000E+000 0.763161731417040E+000 0.000000000000000E+000 0.000000000000000E+000 0.614482700408990E+000 0.000000000000000E+000 0.000000000000000E+000 0.427252706777879E+000 0.000000000000000E+000 0.000000000000000E+000 0.236339500157304E+000 0.000000000000000E+000 0.000000000000000E+000 0.687533091366704E-001 0.000000000000000E+000 0.000000000000000E+000 -0.563531587388063E-001 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968104E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094382E+000 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705005E+000 0.000000000000000E+000 0.000000000000000E+000 -0.239408844315222E-001 0.000000000000000E+000 0.000000000000000E+000 0.756286400503296E-001 0.000000000000000E+000 0.000000000000000E+000 0.167586191020629E+000 0.000000000000000E+000 0.000000000000000E+000 0.216081828715246E+000 0.000000000000000E+000 0.000000000000000E+000 0.166972322189051E+000 0.000000000000000E+000 0.000000000000000E+000 0.156536552052236E+000 0.000000000000000E+000 0.000000000000000E+000 0.146100781915420E+000 0.000000000000000E+000 0.000000000000000E+000 0.135665011778603E+000 0.000000000000000E+000 0.000000000000000E+000 0.125229241641791E+000 0.000000000000000E+000 0.000000000000000E+000 0.114793471504970E+000 0.000000000000000E+000 0.000000000000000E+000 0.104357701368157E+000 0.000000000000000E+000 0.000000000000000E+000 0.939219312313410E-001 0.000000000000000E+000 0.000000000000000E+000 0.834861610945276E-001 0.000000000000000E+000 0.000000000000000E+000 0.730503909577098E-001 0.000000000000000E+000 0.000000000000000E+000 0.626146208208925E-001 0.000000000000000E+000 0.000000000000000E+000 0.521788506840807E-001 0.000000000000000E+000 0.000000000000000E+000 0.417430805472624E-001 0.000000000000000E+000 0.000000000000000E+000 0.313073104104465E-001 0.000000000000000E+000 0.000000000000000E+000 0.208715402736322E-001 0.000000000000000E+000 0.000000000000000E+000 0.135051142947032E-001 0.000000000000000E+000 0.000000000000000E+000 0.111724127347090E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788133E-002 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473233E-002 0.000000000000000E+000 0.000000000000000E+000 -0.859416364208426E-002 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631264E-001 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968104E-001 0.000000000000000E+000 0.000000000000000E+000 -0.626146208208981E-002 0.000000000000000E+000 0.000000000000000E+000 0.859416364208368E-002 0.000000000000000E+000 0.000000000000000E+000 0.337627857367574E-001 0.000000000000000E+000 0.000000000000000E+000 0.712087844629798E-001 0.000000000000000E+000 0.000000000000000E+000 0.122896540081798E+000 0.000000000000000E+000 0.000000000000000E+000 0.190790432854260E+000 0.000000000000000E+000 0.000000000000000E+000 0.276854843041413E+000 0.000000000000000E+000 0.000000000000000E+000 0.383054150904306E+000 0.000000000000000E+000 0.000000000000000E+000 0.553709686082826E+000 0.000000000000000E+000 0.000000000000000E+000 0.202576714420540E+000 0.000000000000000E+000 0.000000000000000E+000 0.270102285894060E-001 0.000000000000000E+000 0.000000000000000E+000 0.572371298562780E+000 0.000000000000000E+000 0.000000000000000E+000 0.491586160327192E+000 0.000000000000000E+000 0.000000000000000E+000 0.356043922314899E+000 0.000000000000000E+000 0.000000000000000E+000 0.202576714420546E+000 0.000000000000000E+000 0.000000000000000E+000 0.601591454945855E-001 0.000000000000000E+000 0.000000000000000E+000 -0.500916966567174E-001 0.000000000000000E+000 0.000000000000000E+000 -0.114916245271292E+000 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631256E+000 0.000000000000000E+000 0.000000000000000E+000 -0.945358000629234E-001 0.000000000000000E+000 0.000000000000000E+000 -0.220992779367877E-001 0.000000000000000E+000 0.000000000000000E+000 0.702265943324503E-001 0.000000000000000E+000 0.000000000000000E+000 0.156413778285921E+000 0.000000000000000E+000 0.000000000000000E+000 0.189071600125843E+000 0.000000000000000E+000 0.000000000000000E+000 0.175566485831134E+000 0.000000000000000E+000 0.000000000000000E+000 0.162061371536433E+000 0.000000000000000E+000 0.000000000000000E+000 0.148556257241731E+000 0.000000000000000E+000 0.000000000000000E+000 0.135051142947025E+000 0.000000000000000E+000 0.000000000000000E+000 0.121546028652326E+000 0.000000000000000E+000 0.000000000000000E+000 0.108040914357620E+000 0.000000000000000E+000 0.000000000000000E+000 0.945358000629183E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857682160E-001 0.000000000000000E+000 0.000000000000000E+000 0.675255714735138E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788117E-001 0.000000000000000E+000 0.000000000000000E+000 0.405153428841102E-001 0.000000000000000E+000 0.000000000000000E+000 0.223448254694163E-001 0.000000000000000E+000 0.000000000000000E+000 0.108040914357621E-001 0.000000000000000E+000 0.000000000000000E+000 -0.368321298946501E-002 0.000000000000000E+000 0.000000000000000E+000 -0.171883272841687E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262516E-001 0.000000000000000E+000 0.000000000000000E+000 -0.255369433936213E-001 0.000000000000000E+000 0.000000000000000E+000 -0.125229241641798E-001 0.000000000000000E+000 0.000000000000000E+000 0.171883272841669E-001 0.000000000000000E+000 0.000000000000000E+000 0.675255714735150E-001 0.000000000000000E+000 0.000000000000000E+000 0.142417568925959E+000 0.000000000000000E+000 0.000000000000000E+000 0.245793080163596E+000 0.000000000000000E+000 0.000000000000000E+000 0.381580865708520E+000 0.000000000000000E+000 0.000000000000000E+000 0.368689620245394E+000 0.000000000000000E+000 0.000000000000000E+000 0.145241365551209E+000 0.000000000000000E+000 0.000000000000000E+000 0.335172382041257E-001 0.000000000000000E+000 0.000000000000000E+000 0.284835137851919E+000 0.000000000000000E+000 0.000000000000000E+000 0.168813928683788E+000 0.000000000000000E+000 0.000000000000000E+000 0.515649818525023E-001 0.000000000000000E+000 0.000000000000000E+000 -0.438302345746280E-001 0.000000000000000E+000 0.000000000000000E+000 -0.102147773574482E+000 0.000000000000000E+000 0.000000000000000E+000 -0.116021209168131E+000 0.000000000000000E+000 0.000000000000000E+000 -0.859416364208374E-001 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420559E-001 0.000000000000000E+000 0.000000000000000E+000 0.648245486145733E-001 0.000000000000000E+000 0.000000000000000E+000 0.134068952816504E+000 0.000000000000000E+000 0.000000000000000E+000 0.122896540081796E+000 0.000000000000000E+000 0.000000000000000E+000 0.111724127347085E+000 0.000000000000000E+000 0.000000000000000E+000 0.100551714612378E+000 0.000000000000000E+000 0.000000000000000E+000 0.893793018776687E-001 0.000000000000000E+000 0.000000000000000E+000 0.782068891429586E-001 0.000000000000000E+000 0.000000000000000E+000 0.670344764082518E-001 0.000000000000000E+000 0.000000000000000E+000 0.558620636735447E-001 0.000000000000000E+000 0.000000000000000E+000 0.446896509388334E-001 0.000000000000000E+000 0.000000000000000E+000 0.162061371536442E-001 0.000000000000000E+000 0.000000000000000E+000 -0.552481948419794E-002 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262523E-001 0.000000000000000E+000 0.000000000000000E+000 -0.386737363893783E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904309E-001 0.000000000000000E+000 0.000000000000000E+000 -0.187843862462687E-001 0.000000000000000E+000 0.000000000000000E+000 0.257824909262509E-001 0.000000000000000E+000 0.000000000000000E+000 0.101288357210273E+000 0.000000000000000E+000 0.000000000000000E+000 0.213626353388940E+000 0.000000000000000E+000 0.000000000000000E+000 0.135051142947031E+000 0.000000000000000E+000 0.000000000000000E+000 0.594225028966916E-001 0.000000000000000E+000 0.000000000000000E+000 0.216081828715228E-001 0.000000000000000E+000 0.000000000000000E+000 0.429708182104187E-001 0.000000000000000E+000 0.000000000000000E+000 -0.375687724925381E-001 0.000000000000000E+000 0.000000000000000E+000 -0.893793018776729E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705006E+000 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787563E-001 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473255E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788078E-001 0.000000000000000E+000 0.000000000000000E+000 0.486184114609305E-001 0.000000000000000E+000 0.000000000000000E+000 0.432163657430473E-001 0.000000000000000E+000 0.000000000000000E+000 0.378143200251658E-001 0.000000000000000E+000 0.000000000000000E+000 0.324122743072871E-001 0.000000000000000E+000 0.000000000000000E+000 0.270102285894058E-001 0.000000000000000E+000 0.000000000000000E+000 -0.736642597892969E-002 0.000000000000000E+000 0.000000000000000E+000 -0.343766545683364E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525033E-001 0.000000000000000E+000 0.000000000000000E+000 -0.510738867872420E-001 0.000000000000000E+000 0.000000000000000E+000 -0.250458483283590E-001 0.000000000000000E+000 0.000000000000000E+000 0.343766545683351E-001 0.000000000000000E+000 0.000000000000000E+000 -0.313073104104490E-001 0.000000000000000E+000 0.000000000000000E+000 -0.165744584525923E-001 0.000000000000000E+000 0.000000000000000E+000 -0.920803247366310E-002 0.000000000000000E+000 0.000000000000000E+000 -0.766108301808619E-001 0.000000000000000E+000 0.000000000000000E+000 -0.902387182418808E-001 0.000000000000000E+000 0.000000000000000E+000 -0.687533091366704E-001 0.000000000000000E+000 0.000000000000000E+000 -0.147328519578588E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631264E-001 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683955E-001 0.000000000000000E+000 0.000000000000000E+000 -0.429708182104198E-001 0.000000000000000E+000 0.000000000000000E+000 -0.644562273156300E-001 0.000000000000000E+000 0.000000000000000E+000 -0.638423584840521E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787542E-001 0.000000000000000E+000 0.000000000000000E+000 -0.601591454945875E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525032E-001 + + + + + + + + + + diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N12.vtp b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N12.vtp new file mode 100644 index 00000000..229aeba7 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N12.vtp @@ -0,0 +1,29 @@ + + + + + + + + + + + 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.100000000000000E+001 0.000000000000000E+000 0.526315789473684E-001 0.000000000000000E+000 0.000000000000000E+000 0.105263157894737E+000 0.000000000000000E+000 0.000000000000000E+000 0.157894736842105E+000 0.000000000000000E+000 0.000000000000000E+000 0.210526315789474E+000 0.000000000000000E+000 0.000000000000000E+000 0.263157894736842E+000 0.000000000000000E+000 0.000000000000000E+000 0.315789473684211E+000 0.000000000000000E+000 0.000000000000000E+000 0.368421052631579E+000 0.000000000000000E+000 0.000000000000000E+000 0.421052631578947E+000 0.000000000000000E+000 0.000000000000000E+000 0.473684210526316E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473684E+000 0.000000000000000E+000 0.000000000000000E+000 0.578947368421053E+000 0.000000000000000E+000 0.000000000000000E+000 0.631578947368421E+000 0.000000000000000E+000 0.000000000000000E+000 0.684210526315789E+000 0.000000000000000E+000 0.000000000000000E+000 0.736842105263158E+000 0.000000000000000E+000 0.000000000000000E+000 0.789473684210526E+000 0.000000000000000E+000 0.000000000000000E+000 0.842105263157895E+000 0.000000000000000E+000 0.000000000000000E+000 0.894736842105263E+000 0.000000000000000E+000 0.000000000000000E+000 0.947368421052632E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.526315789473684E-001 0.409828421199521E-014 0.100000000000000E+001 0.105263157894737E+000 0.757380269611474E-014 0.100000000000000E+001 0.157894736842105E+000 0.108663078535187E-013 0.100000000000000E+001 0.210526315789474E+000 0.140165656858926E-013 0.100000000000000E+001 0.263157894736842E+000 0.162092561595273E-013 0.100000000000000E+001 0.315789473684211E+000 0.175415237890775E-013 0.100000000000000E+001 0.368421052631579E+000 0.193178806284777E-013 0.100000000000000E+001 0.421052631578947E+000 0.195399252334028E-013 0.100000000000000E+001 0.473684210526316E+000 0.226485497023532E-013 0.100000000000000E+001 0.526315789473684E+000 0.213162820728030E-013 0.100000000000000E+001 0.578947368421053E+000 0.204281036531029E-013 0.100000000000000E+001 0.631578947368421E+000 0.159872115546023E-013 0.100000000000000E+001 0.684210526315789E+000 0.195399252334028E-013 0.100000000000000E+001 0.736842105263158E+000 0.177635683940025E-013 0.100000000000000E+001 0.789473684210526E+000 0.106581410364015E-013 0.100000000000000E+001 0.842105263157895E+000 0.710542735760100E-014 0.100000000000000E+001 0.894736842105263E+000 0.710542735760100E-014 0.100000000000000E+001 0.947368421052632E+000 0.710542735760100E-014 0.947368421052632E+000 0.947368421052632E+000 -0.439223148993641E+000 0.894736842105263E+000 0.894736842105263E+000 -0.562488010374388E+000 0.842105263157895E+000 0.842105263157895E+000 -0.464084836672527E+000 0.789473684210526E+000 0.789473684210526E+000 -0.226517598852062E+000 0.736842105263158E+000 0.736842105263158E+000 0.794960136892762E-001 0.684210526315789E+000 0.684210526315789E+000 0.395024593120064E+000 0.631578947368421E+000 0.631578947368421E+000 0.672923013175160E+000 0.578947368421053E+000 0.578947368421053E+000 0.877832429155697E+000 0.526315789473684E+000 0.526315789473684E+000 0.986180277929112E+000 0.473684210526316E+000 0.473684210526316E+000 0.986180277929113E+000 0.421052631578947E+000 0.421052631578947E+000 0.877832429155699E+000 0.368421052631579E+000 0.368421052631579E+000 0.672923013175160E+000 0.315789473684211E+000 0.315789473684211E+000 0.395024593120066E+000 0.263157894736842E+000 0.263157894736842E+000 0.794960136892747E-001 0.210526315789474E+000 0.210526315789474E+000 -0.226517598852065E+000 0.157894736842105E+000 0.157894736842105E+000 -0.464084836672524E+000 0.105263157894737E+000 0.105263157894737E+000 -0.562488010374383E+000 0.526315789473685E-001 0.526315789473685E-001 -0.439223148993639E+000 0.105263157894737E+000 0.526315789473684E-001 -0.383514552527989E+000 0.947368421052632E+000 0.526315789473684E-001 0.690602435524937E-002 0.947368421052632E+000 0.894736842105263E+000 -0.383514552527991E+000 0.157894736842105E+000 0.526315789473684E-001 -0.331489169051803E+000 0.210526315789474E+000 0.526315789473684E-001 -0.283146998565082E+000 0.263157894736842E+000 0.526315789473684E-001 -0.238488041067825E+000 0.315789473684211E+000 0.526315789473684E-001 -0.197512296560033E+000 0.368421052631579E+000 0.526315789473684E-001 -0.160219765041705E+000 0.421052631578947E+000 0.526315789473684E-001 -0.126610446512842E+000 0.473684210526316E+000 0.526315789473684E-001 -0.966843409734425E-001 0.526315789473684E+000 0.526315789473684E-001 -0.704414484235079E-001 0.578947368421053E+000 0.526315789473684E-001 -0.478817688630378E-001 0.631578947368421E+000 0.526315789473684E-001 -0.290053022920320E-001 0.684210526315789E+000 0.526315789473684E-001 -0.138120487104907E-001 0.736842105263158E+000 0.526315789473684E-001 -0.230200811841398E-002 0.789473684210526E+000 0.526315789473684E-001 0.552481948419857E-002 0.842105263157895E+000 0.526315789473684E-001 0.966843409734654E-002 0.894736842105263E+000 0.526315789473684E-001 0.101288357210301E-001 0.947368421052632E+000 0.105263157894737E+000 0.101288357210337E-001 0.947368421052631E+000 0.157894736842105E+000 0.966843409735340E-002 0.947368421052632E+000 0.210526315789474E+000 0.552481948420852E-002 0.947368421052631E+000 0.263157894736842E+000 -0.230200811840148E-002 0.947368421052632E+000 0.315789473684211E+000 -0.138120487104773E-001 0.947368421052632E+000 0.368421052631579E+000 -0.290053022920165E-001 0.947368421052632E+000 0.421052631578947E+000 -0.478817688630220E-001 0.947368421052632E+000 0.473684210526316E+000 -0.704414484234883E-001 0.947368421052632E+000 0.526315789473684E+000 -0.966843409734226E-001 0.947368421052632E+000 0.578947368421053E+000 -0.126610446512825E+000 0.947368421052632E+000 0.631578947368421E+000 -0.160219765041694E+000 0.947368421052632E+000 0.684210526315789E+000 -0.197512296560019E+000 0.947368421052632E+000 0.736842105263158E+000 -0.238488041067814E+000 0.947368421052632E+000 0.789473684210526E+000 -0.283146998565062E+000 0.947368421052632E+000 0.842105263157895E+000 -0.331489169051792E+000 0.894736842105263E+000 0.842105263157895E+000 -0.486184114609308E+000 0.842105263157895E+000 0.789473684210526E+000 -0.396405797991111E+000 0.789473684210526E+000 0.736842105263158E+000 -0.190790432854257E+000 0.736842105263158E+000 0.684210526315789E+000 0.658374321866830E-001 0.684210526315789E+000 0.631578947368421E+000 0.320439530083409E+000 0.631578947368421E+000 0.578947368421053E+000 0.531763875353935E+000 0.578947368421053E+000 0.526315789473684E+000 0.670344764082532E+000 0.526315789473684E+000 0.473684210526316E+000 0.718502773919785E+000 0.473684210526316E+000 0.421052631578947E+000 0.670344764082536E+000 0.421052631578947E+000 0.368421052631579E+000 0.531763875353934E+000 0.368421052631579E+000 0.315789473684211E+000 0.320439530083409E+000 0.315789473684211E+000 0.263157894736842E+000 0.658374321866768E-001 0.263157894736842E+000 0.210526315789474E+000 -0.190790432854260E+000 0.210526315789474E+000 0.157894736842105E+000 -0.396405797991114E+000 0.157894736842105E+000 0.105263157894737E+000 -0.486184114609311E+000 0.210526315789474E+000 0.105263157894737E+000 -0.415282264562120E+000 0.894736842105263E+000 0.105263157894737E+000 0.148556257241788E-001 0.894736842105263E+000 0.789473684210526E+000 -0.415282264562105E+000 0.263157894736842E+000 0.105263157894737E+000 -0.349782460232810E+000 0.315789473684211E+000 0.105263157894737E+000 -0.289684701621381E+000 0.368421052631579E+000 0.105263157894737E+000 -0.234988988727834E+000 0.421052631578947E+000 0.105263157894737E+000 -0.185695321552168E+000 0.473684210526316E+000 0.105263157894737E+000 -0.141803700094382E+000 0.526315789473684E+000 0.105263157894737E+000 -0.103314124354478E+000 0.578947368421053E+000 0.105263157894737E+000 -0.702265943324550E-001 0.631578947368421E+000 0.105263157894737E+000 -0.425411100283132E-001 0.684210526315789E+000 0.105263157894737E+000 -0.202576714420524E-001 0.736842105263158E+000 0.105263157894737E+000 -0.337627857367291E-002 0.789473684210526E+000 0.105263157894737E+000 0.810306857682533E-002 0.842105263157895E+000 0.105263157894737E+000 0.141803700094428E-001 0.894736842105263E+000 0.157894736842105E+000 0.141803700094458E-001 0.894736842105263E+000 0.210526315789474E+000 0.810306857683182E-002 0.894736842105263E+000 0.263157894736842E+000 -0.337627857366474E-002 0.894736842105263E+000 0.315789473684211E+000 -0.202576714420424E-001 0.894736842105263E+000 0.368421052631579E+000 -0.425411100282997E-001 0.894736842105263E+000 0.421052631578947E+000 -0.702265943324418E-001 0.894736842105263E+000 0.473684210526316E+000 -0.103314124354464E+000 0.894736842105263E+000 0.526315789473684E+000 -0.141803700094368E+000 0.894736842105263E+000 0.578947368421053E+000 -0.185695321552154E+000 0.894736842105263E+000 0.631578947368421E+000 -0.234988988727817E+000 0.894736842105263E+000 0.684210526315789E+000 -0.289684701621370E+000 0.894736842105263E+000 0.736842105263158E+000 -0.349782460232802E+000 0.842105263157895E+000 0.736842105263158E+000 -0.333883257494946E+000 0.789473684210526E+000 0.684210526315789E+000 -0.158009837248020E+000 0.736842105263158E+000 0.631578947368421E+000 0.534065883472365E-001 0.684210526315789E+000 0.578947368421053E+000 0.253220893025687E+000 0.631578947368421E+000 0.526315789473684E+000 0.406074232088462E+000 0.578947368421053E+000 0.473684210526316E+000 0.488394042402991E+000 0.526315789473684E+000 0.421052631578947E+000 0.488394042402990E+000 0.473684210526316E+000 0.368421052631579E+000 0.406074232088460E+000 0.421052631578947E+000 0.315789473684211E+000 0.253220893025682E+000 0.368421052631579E+000 0.263157894736842E+000 0.534065883472347E-001 0.315789473684211E+000 0.210526315789474E+000 -0.158009837248026E+000 0.263157894736842E+000 0.157894736842105E+000 -0.333883257494955E+000 0.315789473684211E+000 0.157894736842105E+000 -0.276517215184046E+000 0.842105263157895E+000 0.157894736842105E+000 0.135358077362882E-001 0.842105263157895E+000 0.684210526315789E+000 -0.276517215184038E+000 0.368421052631579E+000 0.157894736842105E+000 -0.224307671058387E+000 0.421052631578947E+000 0.157894736842105E+000 -0.177254625117978E+000 0.473684210526316E+000 0.157894736842105E+000 -0.135358077362819E+000 0.526315789473684E+000 0.157894736842105E+000 -0.986180277929108E-001 0.578947368421053E+000 0.157894736842105E+000 -0.670344764082519E-001 0.631578947368421E+000 0.157894736842105E+000 -0.406074232088437E-001 0.684210526315790E+000 0.157894736842105E+000 -0.193368681946852E-001 0.736842105263158E+000 0.157894736842105E+000 -0.322281136577741E-002 0.789473684210526E+000 0.157894736842105E+000 0.773474727788057E-002 0.842105263157895E+000 0.210526315789474E+000 0.773474727788348E-002 0.842105263157895E+000 0.263157894736842E+000 -0.322281136577185E-002 0.842105263157895E+000 0.315789473684210E+000 -0.193368681946797E-001 0.842105263157895E+000 0.368421052631579E+000 -0.406074232088354E-001 0.842105263157895E+000 0.421052631578947E+000 -0.670344764082400E-001 0.842105263157894E+000 0.473684210526316E+000 -0.986180277928970E-001 0.842105263157894E+000 0.526315789473684E+000 -0.135358077362809E+000 0.842105263157894E+000 0.578947368421052E+000 -0.177254625117964E+000 0.842105263157894E+000 0.631578947368421E+000 -0.224307671058380E+000 0.789473684210526E+000 0.631578947368421E+000 -0.128175812033358E+000 0.736842105263158E+000 0.578947368421053E+000 0.422034821709536E-001 0.684210526315789E+000 0.526315789473684E+000 0.193368681946892E+000 0.631578947368421E+000 0.473684210526316E+000 0.295854083378738E+000 0.578947368421053E+000 0.421052631578947E+000 0.331980264117068E+000 0.526315789473684E+000 0.368421052631579E+000 0.295854083378736E+000 0.473684210526316E+000 0.315789473684211E+000 0.193368681946886E+000 0.421052631578947E+000 0.263157894736842E+000 0.422034821709472E-001 0.368421052631579E+000 0.210526315789474E+000 -0.128175812033364E+000 0.421052631578947E+000 0.210526315789474E+000 -0.101288357210273E+000 0.789473684210526E+000 0.210526315789474E+000 0.441985558736327E-002 0.789473684210526E+000 0.578947368421053E+000 -0.101288357210265E+000 0.473684210526316E+000 0.210526315789474E+000 -0.773474727787535E-001 0.526315789473684E+000 0.210526315789474E+000 -0.563531587388053E-001 0.578947368421053E+000 0.210526315789474E+000 -0.383054150904288E-001 0.631578947368421E+000 0.210526315789474E+000 -0.232042418336238E-001 0.684210526315789E+000 0.210526315789474E+000 -0.110496389683896E-001 0.736842105263158E+000 0.210526315789474E+000 -0.184160649472737E-002 0.789473684210526E+000 0.263157894736842E+000 -0.184160649472465E-002 0.789473684210526E+000 0.315789473684211E+000 -0.110496389683862E-001 0.789473684210526E+000 0.368421052631579E+000 -0.232042418336174E-001 0.789473684210526E+000 0.421052631578947E+000 -0.383054150904236E-001 0.789473684210526E+000 0.473684210526316E+000 -0.563531587387964E-001 0.789473684210526E+000 0.526315789473684E+000 -0.773474727787473E-001 0.736842105263158E+000 0.526315789473684E+000 0.322281136578217E-001 0.684210526315789E+000 0.473684210526316E+000 0.140882896847021E+000 0.631578947368421E+000 0.421052631578947E+000 0.201103429224763E+000 0.578947368421053E+000 0.368421052631579E+000 0.201103429224763E+000 0.526315789473684E+000 0.315789473684211E+000 0.140882896847018E+000 0.473684210526316E+000 0.263157894736842E+000 0.322281136578146E-001 0.526315789473684E+000 0.263157894736842E+000 0.234804828078372E-001 0.736842105263158E+000 0.263157894736842E+000 0.767336039477151E-003 0.736842105263158E+000 0.473684210526316E+000 0.234804828078423E-001 0.578947368421053E+000 0.263157894736842E+000 0.159605896210155E-001 0.631578947368421E+000 0.263157894736842E+000 0.966843409734769E-002 0.684210526315789E+000 0.263157894736842E+000 0.460401623683504E-002 0.736842105263158E+000 0.315789473684211E+000 0.460401623683726E-002 0.736842105263158E+000 0.368421052631579E+000 0.966843409735141E-002 0.736842105263158E+000 0.421052631578947E+000 0.159605896210193E-001 0.684210526315789E+000 0.421052631578947E+000 0.957635377260806E-001 0.631578947368421E+000 0.368421052631579E+000 0.121822269626542E+000 0.578947368421053E+000 0.315789473684211E+000 0.957635377260778E-001 0.631578947368421E+000 0.315789473684211E+000 0.580106045840678E-001 0.684210526315789E+000 0.315789473684211E+000 0.276240974209884E-001 0.684210526315789E+000 0.368421052631579E+000 0.580106045840700E-001 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.100000000000000E+001 0.284217094304040E-013 0.000000000000000E+000 0.100000000000000E+001 0.000000000000000E+000 0.526315789473684E-001 0.526315789473684E-001 -0.439223148993639E+000 0.105263157894737E+000 0.105263157894737E+000 -0.562488010374383E+000 0.157894736842105E+000 0.157894736842105E+000 -0.464084836672524E+000 0.210526315789474E+000 0.210526315789474E+000 -0.226517598852065E+000 0.263157894736842E+000 0.263157894736842E+000 0.794960136892755E-001 0.315789473684211E+000 0.315789473684211E+000 0.395024593120065E+000 0.368421052631579E+000 0.368421052631579E+000 0.672923013175161E+000 0.421052631578947E+000 0.421052631578947E+000 0.877832429155701E+000 0.473684210526316E+000 0.473684210526316E+000 0.986180277929117E+000 0.526315789473684E+000 0.526315789473684E+000 0.986180277929119E+000 0.578947368421053E+000 0.578947368421053E+000 0.877832429155703E+000 0.631578947368421E+000 0.631578947368421E+000 0.672923013175167E+000 0.684210526315789E+000 0.684210526315789E+000 0.395024593120073E+000 0.736842105263158E+000 0.736842105263158E+000 0.794960136892868E-001 0.789473684210526E+000 0.789473684210526E+000 -0.226517598852048E+000 0.842105263157895E+000 0.842105263157895E+000 -0.464084836672512E+000 0.894736842105263E+000 0.894736842105263E+000 -0.562488010374366E+000 0.947368421052632E+000 0.947368421052632E+000 -0.439223148993619E+000 0.947368421052632E+000 0.100000000000000E+001 0.210348006962958E-013 0.894736842105263E+000 0.100000000000000E+001 0.217307110400020E-013 0.842105263157895E+000 0.100000000000000E+001 0.143386844317059E-013 0.789473684210526E+000 0.100000000000000E+001 0.208848710491643E-013 0.736842105263158E+000 0.100000000000000E+001 0.173819108598890E-013 0.684210526315789E+000 0.100000000000000E+001 0.113780118912141E-013 0.631578947368421E+000 0.100000000000000E+001 0.931639330631646E-014 0.578947368421053E+000 0.100000000000000E+001 0.107621256761647E-013 0.526315789473684E+000 0.100000000000000E+001 0.684781874504404E-014 0.473684210526316E+000 0.100000000000000E+001 0.514261718216008E-014 0.421052631578947E+000 0.100000000000000E+001 0.478320483003490E-014 0.368421052631579E+000 0.100000000000000E+001 0.269105364240816E-014 0.315789473684211E+000 0.100000000000000E+001 0.245420788123829E-014 0.263157894736842E+000 0.100000000000000E+001 0.233687545075082E-014 0.210526315789474E+000 0.100000000000000E+001 0.194076604518931E-014 0.157894736842105E+000 0.100000000000000E+001 0.109486812419020E-014 0.105263157894737E+000 0.100000000000000E+001 0.410560425095361E-015 0.526315789473685E-001 0.100000000000000E+001 0.881222114801000E-016 0.000000000000000E+000 0.947368421052632E+000 0.000000000000000E+000 0.000000000000000E+000 0.894736842105263E+000 0.000000000000000E+000 0.000000000000000E+000 0.842105263157895E+000 0.000000000000000E+000 0.000000000000000E+000 0.789473684210526E+000 0.000000000000000E+000 0.000000000000000E+000 0.736842105263158E+000 0.000000000000000E+000 0.000000000000000E+000 0.684210526315789E+000 0.000000000000000E+000 0.000000000000000E+000 0.631578947368421E+000 0.000000000000000E+000 0.000000000000000E+000 0.578947368421053E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473684E+000 0.000000000000000E+000 0.000000000000000E+000 0.473684210526316E+000 0.000000000000000E+000 0.000000000000000E+000 0.421052631578947E+000 0.000000000000000E+000 0.000000000000000E+000 0.368421052631579E+000 0.000000000000000E+000 0.000000000000000E+000 0.315789473684211E+000 0.000000000000000E+000 0.000000000000000E+000 0.263157894736842E+000 0.000000000000000E+000 0.000000000000000E+000 0.210526315789474E+000 0.000000000000000E+000 0.000000000000000E+000 0.157894736842105E+000 0.000000000000000E+000 0.000000000000000E+000 0.105263157894737E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473685E-001 0.000000000000000E+000 0.526315789473684E-001 0.105263157894737E+000 -0.383514552527989E+000 0.894736842105263E+000 0.947368421052632E+000 -0.383514552527971E+000 0.526315789473684E-001 0.947368421052632E+000 0.690602435524585E-002 0.105263157894737E+000 0.157894736842105E+000 -0.486184114609311E+000 0.157894736842105E+000 0.210526315789474E+000 -0.396405797991114E+000 0.210526315789474E+000 0.263157894736842E+000 -0.190790432854260E+000 0.263157894736842E+000 0.315789473684211E+000 0.658374321866781E-001 0.315789473684211E+000 0.368421052631579E+000 0.320439530083410E+000 0.368421052631579E+000 0.421052631578947E+000 0.531763875353935E+000 0.421052631578947E+000 0.473684210526316E+000 0.670344764082536E+000 0.473684210526316E+000 0.526315789473684E+000 0.718502773919786E+000 0.526315789473684E+000 0.578947368421053E+000 0.670344764082541E+000 0.578947368421053E+000 0.631578947368421E+000 0.531763875353937E+000 0.631578947368421E+000 0.684210526315789E+000 0.320439530083417E+000 0.684210526315789E+000 0.736842105263158E+000 0.658374321866855E-001 0.736842105263158E+000 0.789473684210526E+000 -0.190790432854247E+000 0.789473684210526E+000 0.842105263157895E+000 -0.396405797991097E+000 0.842105263157895E+000 0.894736842105263E+000 -0.486184114609299E+000 0.842105263157895E+000 0.947368421052632E+000 -0.331489169051790E+000 0.789473684210526E+000 0.947368421052631E+000 -0.283146998565064E+000 0.736842105263158E+000 0.947368421052632E+000 -0.238488041067809E+000 0.684210526315789E+000 0.947368421052631E+000 -0.197512296560023E+000 0.631578947368421E+000 0.947368421052632E+000 -0.160219765041695E+000 0.578947368421053E+000 0.947368421052632E+000 -0.126610446512834E+000 0.526315789473684E+000 0.947368421052632E+000 -0.966843409734348E-001 0.473684210526316E+000 0.947368421052632E+000 -0.704414484235017E-001 0.421052631578947E+000 0.947368421052632E+000 -0.478817688630357E-001 0.368421052631579E+000 0.947368421052632E+000 -0.290053022920287E-001 0.315789473684211E+000 0.947368421052632E+000 -0.138120487104883E-001 0.263157894736842E+000 0.947368421052632E+000 -0.230200811841392E-002 0.210526315789474E+000 0.947368421052632E+000 0.552481948419819E-002 0.157894736842105E+000 0.947368421052632E+000 0.966843409734531E-002 0.105263157894737E+000 0.947368421052632E+000 0.101288357210276E-001 0.526315789473684E-001 0.894736842105263E+000 0.101288357210273E-001 0.526315789473684E-001 0.842105263157895E+000 0.966843409734437E-002 0.526315789473684E-001 0.789473684210526E+000 0.552481948419676E-002 0.526315789473684E-001 0.736842105263158E+000 -0.230200811841513E-002 0.526315789473684E-001 0.684210526315789E+000 -0.138120487104916E-001 0.526315789473684E-001 0.631578947368421E+000 -0.290053022920325E-001 0.526315789473684E-001 0.578947368421053E+000 -0.478817688630380E-001 0.526315789473684E-001 0.526315789473684E+000 -0.704414484235079E-001 0.526315789473684E-001 0.473684210526316E+000 -0.966843409734423E-001 0.526315789473684E-001 0.421052631578947E+000 -0.126610446512841E+000 0.526315789473684E-001 0.368421052631579E+000 -0.160219765041705E+000 0.526315789473684E-001 0.315789473684211E+000 -0.197512296560032E+000 0.526315789473684E-001 0.263157894736842E+000 -0.238488041067825E+000 0.526315789473684E-001 0.210526315789474E+000 -0.283146998565082E+000 0.526315789473684E-001 0.157894736842105E+000 -0.331489169051803E+000 0.105263157894737E+000 0.210526315789474E+000 -0.415282264562120E+000 0.789473684210526E+000 0.894736842105263E+000 -0.415282264562101E+000 0.105263157894737E+000 0.894736842105263E+000 0.148556257241741E-001 0.157894736842105E+000 0.263157894736842E+000 -0.333883257494955E+000 0.210526315789474E+000 0.315789473684211E+000 -0.158009837248026E+000 0.263157894736842E+000 0.368421052631579E+000 0.534065883472353E-001 0.315789473684211E+000 0.421052631578947E+000 0.253220893025683E+000 0.368421052631579E+000 0.473684210526316E+000 0.406074232088461E+000 0.421052631578947E+000 0.526315789473684E+000 0.488394042402992E+000 0.473684210526316E+000 0.578947368421053E+000 0.488394042402993E+000 0.526315789473684E+000 0.631578947368421E+000 0.406074232088462E+000 0.578947368421053E+000 0.684210526315789E+000 0.253220893025687E+000 0.631578947368421E+000 0.736842105263158E+000 0.534065883472413E-001 0.684210526315789E+000 0.789473684210526E+000 -0.158009837248017E+000 0.736842105263158E+000 0.842105263157895E+000 -0.333883257494941E+000 0.736842105263158E+000 0.894736842105263E+000 -0.349782460232796E+000 0.684210526315789E+000 0.894736842105263E+000 -0.289684701621371E+000 0.631578947368421E+000 0.894736842105263E+000 -0.234988988727824E+000 0.578947368421053E+000 0.894736842105263E+000 -0.185695321552163E+000 0.526315789473684E+000 0.894736842105263E+000 -0.141803700094374E+000 0.473684210526316E+000 0.894736842105263E+000 -0.103314124354473E+000 0.421052631578947E+000 0.894736842105263E+000 -0.702265943324511E-001 0.368421052631579E+000 0.894736842105263E+000 -0.425411100283106E-001 0.315789473684211E+000 0.894736842105263E+000 -0.202576714420530E-001 0.263157894736842E+000 0.894736842105263E+000 -0.337627857367406E-002 0.210526315789474E+000 0.894736842105263E+000 0.810306857682338E-002 0.157894736842105E+000 0.894736842105263E+000 0.141803700094389E-001 0.105263157894737E+000 0.842105263157895E+000 0.141803700094389E-001 0.105263157894737E+000 0.789473684210526E+000 0.810306857682234E-002 0.105263157894737E+000 0.736842105263158E+000 -0.337627857367526E-002 0.105263157894737E+000 0.684210526315789E+000 -0.202576714420539E-001 0.105263157894737E+000 0.631578947368421E+000 -0.425411100283144E-001 0.105263157894737E+000 0.578947368421053E+000 -0.702265943324556E-001 0.105263157894737E+000 0.526315789473684E+000 -0.103314124354478E+000 0.105263157894737E+000 0.473684210526316E+000 -0.141803700094382E+000 0.105263157894737E+000 0.421052631578947E+000 -0.185695321552167E+000 0.105263157894737E+000 0.368421052631579E+000 -0.234988988727833E+000 0.105263157894737E+000 0.315789473684211E+000 -0.289684701621381E+000 0.105263157894737E+000 0.263157894736842E+000 -0.349782460232810E+000 0.157894736842105E+000 0.315789473684211E+000 -0.276517215184045E+000 0.684210526315789E+000 0.842105263157895E+000 -0.276517215184036E+000 0.157894736842105E+000 0.842105263157895E+000 0.135358077362831E-001 0.210526315789474E+000 0.368421052631579E+000 -0.128175812033364E+000 0.263157894736842E+000 0.421052631578947E+000 0.422034821709477E-001 0.315789473684211E+000 0.473684210526316E+000 0.193368681946886E+000 0.368421052631579E+000 0.526315789473684E+000 0.295854083378736E+000 0.421052631578947E+000 0.578947368421053E+000 0.331980264117067E+000 0.473684210526316E+000 0.631578947368421E+000 0.295854083378737E+000 0.526315789473684E+000 0.684210526315790E+000 0.193368681946889E+000 0.578947368421053E+000 0.736842105263158E+000 0.422034821709505E-001 0.631578947368421E+000 0.789473684210526E+000 -0.128175812033357E+000 0.631578947368421E+000 0.842105263157895E+000 -0.224307671058378E+000 0.578947368421053E+000 0.842105263157895E+000 -0.177254625117973E+000 0.526315789473684E+000 0.842105263157895E+000 -0.135358077362811E+000 0.473684210526316E+000 0.842105263157895E+000 -0.986180277929068E-001 0.421052631578947E+000 0.842105263157895E+000 -0.670344764082493E-001 0.368421052631579E+000 0.842105263157894E+000 -0.406074232088420E-001 0.315789473684210E+000 0.842105263157894E+000 -0.193368681946864E-001 0.263157894736842E+000 0.842105263157894E+000 -0.322281136577941E-002 0.210526315789474E+000 0.842105263157894E+000 0.773474727787664E-002 0.157894736842105E+000 0.789473684210526E+000 0.773474727787624E-002 0.157894736842105E+000 0.736842105263158E+000 -0.322281136578049E-002 0.157894736842105E+000 0.684210526315789E+000 -0.193368681946875E-001 0.157894736842105E+000 0.631578947368421E+000 -0.406074232088450E-001 0.157894736842105E+000 0.578947368421053E+000 -0.670344764082528E-001 0.157894736842105E+000 0.526315789473684E+000 -0.986180277929109E-001 0.157894736842105E+000 0.473684210526316E+000 -0.135358077362819E+000 0.157894736842105E+000 0.421052631578947E+000 -0.177254625117977E+000 0.157894736842105E+000 0.368421052631579E+000 -0.224307671058386E+000 0.210526315789474E+000 0.421052631578947E+000 -0.101288357210273E+000 0.578947368421053E+000 0.789473684210526E+000 -0.101288357210266E+000 0.210526315789474E+000 0.789473684210526E+000 0.441985558735864E-002 0.263157894736842E+000 0.473684210526316E+000 0.322281136578149E-001 0.315789473684211E+000 0.526315789473684E+000 0.140882896847017E+000 0.368421052631579E+000 0.578947368421053E+000 0.201103429224763E+000 0.421052631578947E+000 0.631578947368421E+000 0.201103429224763E+000 0.473684210526316E+000 0.684210526315789E+000 0.140882896847021E+000 0.526315789473684E+000 0.736842105263158E+000 0.322281136578208E-001 0.526315789473684E+000 0.789473684210526E+000 -0.773474727787452E-001 0.473684210526316E+000 0.789473684210526E+000 -0.563531587388017E-001 0.421052631578947E+000 0.789473684210526E+000 -0.383054150904271E-001 0.368421052631579E+000 0.789473684210526E+000 -0.232042418336230E-001 0.315789473684211E+000 0.789473684210526E+000 -0.110496389683912E-001 0.263157894736842E+000 0.789473684210526E+000 -0.184160649473107E-002 0.210526315789474E+000 0.736842105263158E+000 -0.184160649473118E-002 0.210526315789474E+000 0.684210526315789E+000 -0.110496389683921E-001 0.210526315789474E+000 0.631578947368421E+000 -0.232042418336255E-001 0.210526315789474E+000 0.578947368421053E+000 -0.383054150904296E-001 0.210526315789474E+000 0.526315789473684E+000 -0.563531587388059E-001 0.210526315789474E+000 0.473684210526316E+000 -0.773474727787537E-001 0.263157894736842E+000 0.526315789473684E+000 0.234804828078375E-001 0.473684210526316E+000 0.736842105263158E+000 0.234804828078414E-001 0.263157894736842E+000 0.736842105263158E+000 0.767336039473525E-003 0.315789473684211E+000 0.578947368421053E+000 0.957635377260774E-001 0.368421052631579E+000 0.631578947368421E+000 0.121822269626540E+000 0.421052631578947E+000 0.684210526315789E+000 0.957635377260789E-001 0.421052631578947E+000 0.736842105263158E+000 0.159605896210158E-001 0.368421052631579E+000 0.736842105263158E+000 0.966843409734689E-002 0.315789473684211E+000 0.736842105263158E+000 0.460401623683193E-002 0.263157894736842E+000 0.684210526315789E+000 0.460401623683193E-002 0.263157894736842E+000 0.631578947368421E+000 0.966843409734582E-002 0.263157894736842E+000 0.578947368421053E+000 0.159605896210142E-001 0.315789473684211E+000 0.631578947368421E+000 0.580106045840666E-001 0.368421052631579E+000 0.684210526315789E+000 0.580106045840673E-001 0.315789473684211E+000 0.684210526315789E+000 0.276240974209848E-001 + + + + + + + + 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.409828421199521E-014 0.000000000000000E+000 0.000000000000000E+000 0.757380269611474E-014 0.000000000000000E+000 0.000000000000000E+000 0.108663078535187E-013 0.000000000000000E+000 0.000000000000000E+000 0.140165656858926E-013 0.000000000000000E+000 0.000000000000000E+000 0.162092561595273E-013 0.000000000000000E+000 0.000000000000000E+000 0.175415237890775E-013 0.000000000000000E+000 0.000000000000000E+000 0.193178806284777E-013 0.000000000000000E+000 0.000000000000000E+000 0.195399252334028E-013 0.000000000000000E+000 0.000000000000000E+000 0.226485497023532E-013 0.000000000000000E+000 0.000000000000000E+000 0.213162820728030E-013 0.000000000000000E+000 0.000000000000000E+000 0.204281036531029E-013 0.000000000000000E+000 0.000000000000000E+000 0.159872115546023E-013 0.000000000000000E+000 0.000000000000000E+000 0.195399252334028E-013 0.000000000000000E+000 0.000000000000000E+000 0.177635683940025E-013 0.000000000000000E+000 0.000000000000000E+000 0.106581410364015E-013 0.000000000000000E+000 0.000000000000000E+000 0.710542735760100E-014 0.000000000000000E+000 0.000000000000000E+000 0.710542735760100E-014 0.000000000000000E+000 0.000000000000000E+000 0.710542735760100E-014 0.000000000000000E+000 0.000000000000000E+000 -0.439223148993641E+000 0.000000000000000E+000 0.000000000000000E+000 -0.562488010374388E+000 0.000000000000000E+000 0.000000000000000E+000 -0.464084836672527E+000 0.000000000000000E+000 0.000000000000000E+000 -0.226517598852062E+000 0.000000000000000E+000 0.000000000000000E+000 0.794960136892762E-001 0.000000000000000E+000 0.000000000000000E+000 0.395024593120064E+000 0.000000000000000E+000 0.000000000000000E+000 0.672923013175160E+000 0.000000000000000E+000 0.000000000000000E+000 0.877832429155697E+000 0.000000000000000E+000 0.000000000000000E+000 0.986180277929112E+000 0.000000000000000E+000 0.000000000000000E+000 0.986180277929113E+000 0.000000000000000E+000 0.000000000000000E+000 0.877832429155699E+000 0.000000000000000E+000 0.000000000000000E+000 0.672923013175160E+000 0.000000000000000E+000 0.000000000000000E+000 0.395024593120066E+000 0.000000000000000E+000 0.000000000000000E+000 0.794960136892747E-001 0.000000000000000E+000 0.000000000000000E+000 -0.226517598852065E+000 0.000000000000000E+000 0.000000000000000E+000 -0.464084836672524E+000 0.000000000000000E+000 0.000000000000000E+000 -0.562488010374383E+000 0.000000000000000E+000 0.000000000000000E+000 -0.439223148993639E+000 0.000000000000000E+000 0.000000000000000E+000 -0.383514552527989E+000 0.000000000000000E+000 0.000000000000000E+000 0.690602435524937E-002 0.000000000000000E+000 0.000000000000000E+000 -0.383514552527991E+000 0.000000000000000E+000 0.000000000000000E+000 -0.331489169051803E+000 0.000000000000000E+000 0.000000000000000E+000 -0.283146998565082E+000 0.000000000000000E+000 0.000000000000000E+000 -0.238488041067825E+000 0.000000000000000E+000 0.000000000000000E+000 -0.197512296560033E+000 0.000000000000000E+000 0.000000000000000E+000 -0.160219765041705E+000 0.000000000000000E+000 0.000000000000000E+000 -0.126610446512842E+000 0.000000000000000E+000 0.000000000000000E+000 -0.966843409734425E-001 0.000000000000000E+000 0.000000000000000E+000 -0.704414484235079E-001 0.000000000000000E+000 0.000000000000000E+000 -0.478817688630378E-001 0.000000000000000E+000 0.000000000000000E+000 -0.290053022920320E-001 0.000000000000000E+000 0.000000000000000E+000 -0.138120487104907E-001 0.000000000000000E+000 0.000000000000000E+000 -0.230200811841398E-002 0.000000000000000E+000 0.000000000000000E+000 0.552481948419857E-002 0.000000000000000E+000 0.000000000000000E+000 0.966843409734654E-002 0.000000000000000E+000 0.000000000000000E+000 0.101288357210301E-001 0.000000000000000E+000 0.000000000000000E+000 0.101288357210337E-001 0.000000000000000E+000 0.000000000000000E+000 0.966843409735340E-002 0.000000000000000E+000 0.000000000000000E+000 0.552481948420852E-002 0.000000000000000E+000 0.000000000000000E+000 -0.230200811840148E-002 0.000000000000000E+000 0.000000000000000E+000 -0.138120487104773E-001 0.000000000000000E+000 0.000000000000000E+000 -0.290053022920165E-001 0.000000000000000E+000 0.000000000000000E+000 -0.478817688630220E-001 0.000000000000000E+000 0.000000000000000E+000 -0.704414484234883E-001 0.000000000000000E+000 0.000000000000000E+000 -0.966843409734226E-001 0.000000000000000E+000 0.000000000000000E+000 -0.126610446512825E+000 0.000000000000000E+000 0.000000000000000E+000 -0.160219765041694E+000 0.000000000000000E+000 0.000000000000000E+000 -0.197512296560019E+000 0.000000000000000E+000 0.000000000000000E+000 -0.238488041067814E+000 0.000000000000000E+000 0.000000000000000E+000 -0.283146998565062E+000 0.000000000000000E+000 0.000000000000000E+000 -0.331489169051792E+000 0.000000000000000E+000 0.000000000000000E+000 -0.486184114609308E+000 0.000000000000000E+000 0.000000000000000E+000 -0.396405797991111E+000 0.000000000000000E+000 0.000000000000000E+000 -0.190790432854257E+000 0.000000000000000E+000 0.000000000000000E+000 0.658374321866830E-001 0.000000000000000E+000 0.000000000000000E+000 0.320439530083409E+000 0.000000000000000E+000 0.000000000000000E+000 0.531763875353935E+000 0.000000000000000E+000 0.000000000000000E+000 0.670344764082532E+000 0.000000000000000E+000 0.000000000000000E+000 0.718502773919785E+000 0.000000000000000E+000 0.000000000000000E+000 0.670344764082536E+000 0.000000000000000E+000 0.000000000000000E+000 0.531763875353934E+000 0.000000000000000E+000 0.000000000000000E+000 0.320439530083409E+000 0.000000000000000E+000 0.000000000000000E+000 0.658374321866768E-001 0.000000000000000E+000 0.000000000000000E+000 -0.190790432854260E+000 0.000000000000000E+000 0.000000000000000E+000 -0.396405797991114E+000 0.000000000000000E+000 0.000000000000000E+000 -0.486184114609311E+000 0.000000000000000E+000 0.000000000000000E+000 -0.415282264562120E+000 0.000000000000000E+000 0.000000000000000E+000 0.148556257241788E-001 0.000000000000000E+000 0.000000000000000E+000 -0.415282264562105E+000 0.000000000000000E+000 0.000000000000000E+000 -0.349782460232810E+000 0.000000000000000E+000 0.000000000000000E+000 -0.289684701621381E+000 0.000000000000000E+000 0.000000000000000E+000 -0.234988988727834E+000 0.000000000000000E+000 0.000000000000000E+000 -0.185695321552168E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094382E+000 0.000000000000000E+000 0.000000000000000E+000 -0.103314124354478E+000 0.000000000000000E+000 0.000000000000000E+000 -0.702265943324550E-001 0.000000000000000E+000 0.000000000000000E+000 -0.425411100283132E-001 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420524E-001 0.000000000000000E+000 0.000000000000000E+000 -0.337627857367291E-002 0.000000000000000E+000 0.000000000000000E+000 0.810306857682533E-002 0.000000000000000E+000 0.000000000000000E+000 0.141803700094428E-001 0.000000000000000E+000 0.000000000000000E+000 0.141803700094458E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857683182E-002 0.000000000000000E+000 0.000000000000000E+000 -0.337627857366474E-002 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420424E-001 0.000000000000000E+000 0.000000000000000E+000 -0.425411100282997E-001 0.000000000000000E+000 0.000000000000000E+000 -0.702265943324418E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103314124354464E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094368E+000 0.000000000000000E+000 0.000000000000000E+000 -0.185695321552154E+000 0.000000000000000E+000 0.000000000000000E+000 -0.234988988727817E+000 0.000000000000000E+000 0.000000000000000E+000 -0.289684701621370E+000 0.000000000000000E+000 0.000000000000000E+000 -0.349782460232802E+000 0.000000000000000E+000 0.000000000000000E+000 -0.333883257494946E+000 0.000000000000000E+000 0.000000000000000E+000 -0.158009837248020E+000 0.000000000000000E+000 0.000000000000000E+000 0.534065883472365E-001 0.000000000000000E+000 0.000000000000000E+000 0.253220893025687E+000 0.000000000000000E+000 0.000000000000000E+000 0.406074232088462E+000 0.000000000000000E+000 0.000000000000000E+000 0.488394042402991E+000 0.000000000000000E+000 0.000000000000000E+000 0.488394042402990E+000 0.000000000000000E+000 0.000000000000000E+000 0.406074232088460E+000 0.000000000000000E+000 0.000000000000000E+000 0.253220893025682E+000 0.000000000000000E+000 0.000000000000000E+000 0.534065883472347E-001 0.000000000000000E+000 0.000000000000000E+000 -0.158009837248026E+000 0.000000000000000E+000 0.000000000000000E+000 -0.333883257494955E+000 0.000000000000000E+000 0.000000000000000E+000 -0.276517215184046E+000 0.000000000000000E+000 0.000000000000000E+000 0.135358077362882E-001 0.000000000000000E+000 0.000000000000000E+000 -0.276517215184038E+000 0.000000000000000E+000 0.000000000000000E+000 -0.224307671058387E+000 0.000000000000000E+000 0.000000000000000E+000 -0.177254625117978E+000 0.000000000000000E+000 0.000000000000000E+000 -0.135358077362819E+000 0.000000000000000E+000 0.000000000000000E+000 -0.986180277929108E-001 0.000000000000000E+000 0.000000000000000E+000 -0.670344764082519E-001 0.000000000000000E+000 0.000000000000000E+000 -0.406074232088437E-001 0.000000000000000E+000 0.000000000000000E+000 -0.193368681946852E-001 0.000000000000000E+000 0.000000000000000E+000 -0.322281136577741E-002 0.000000000000000E+000 0.000000000000000E+000 0.773474727788057E-002 0.000000000000000E+000 0.000000000000000E+000 0.773474727788348E-002 0.000000000000000E+000 0.000000000000000E+000 -0.322281136577185E-002 0.000000000000000E+000 0.000000000000000E+000 -0.193368681946797E-001 0.000000000000000E+000 0.000000000000000E+000 -0.406074232088354E-001 0.000000000000000E+000 0.000000000000000E+000 -0.670344764082400E-001 0.000000000000000E+000 0.000000000000000E+000 -0.986180277928970E-001 0.000000000000000E+000 0.000000000000000E+000 -0.135358077362809E+000 0.000000000000000E+000 0.000000000000000E+000 -0.177254625117964E+000 0.000000000000000E+000 0.000000000000000E+000 -0.224307671058380E+000 0.000000000000000E+000 0.000000000000000E+000 -0.128175812033358E+000 0.000000000000000E+000 0.000000000000000E+000 0.422034821709536E-001 0.000000000000000E+000 0.000000000000000E+000 0.193368681946892E+000 0.000000000000000E+000 0.000000000000000E+000 0.295854083378738E+000 0.000000000000000E+000 0.000000000000000E+000 0.331980264117068E+000 0.000000000000000E+000 0.000000000000000E+000 0.295854083378736E+000 0.000000000000000E+000 0.000000000000000E+000 0.193368681946886E+000 0.000000000000000E+000 0.000000000000000E+000 0.422034821709472E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128175812033364E+000 0.000000000000000E+000 0.000000000000000E+000 -0.101288357210273E+000 0.000000000000000E+000 0.000000000000000E+000 0.441985558736327E-002 0.000000000000000E+000 0.000000000000000E+000 -0.101288357210265E+000 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787535E-001 0.000000000000000E+000 0.000000000000000E+000 -0.563531587388053E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904288E-001 0.000000000000000E+000 0.000000000000000E+000 -0.232042418336238E-001 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683896E-001 0.000000000000000E+000 0.000000000000000E+000 -0.184160649472737E-002 0.000000000000000E+000 0.000000000000000E+000 -0.184160649472465E-002 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683862E-001 0.000000000000000E+000 0.000000000000000E+000 -0.232042418336174E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904236E-001 0.000000000000000E+000 0.000000000000000E+000 -0.563531587387964E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787473E-001 0.000000000000000E+000 0.000000000000000E+000 0.322281136578217E-001 0.000000000000000E+000 0.000000000000000E+000 0.140882896847021E+000 0.000000000000000E+000 0.000000000000000E+000 0.201103429224763E+000 0.000000000000000E+000 0.000000000000000E+000 0.201103429224763E+000 0.000000000000000E+000 0.000000000000000E+000 0.140882896847018E+000 0.000000000000000E+000 0.000000000000000E+000 0.322281136578146E-001 0.000000000000000E+000 0.000000000000000E+000 0.234804828078372E-001 0.000000000000000E+000 0.000000000000000E+000 0.767336039477151E-003 0.000000000000000E+000 0.000000000000000E+000 0.234804828078423E-001 0.000000000000000E+000 0.000000000000000E+000 0.159605896210155E-001 0.000000000000000E+000 0.000000000000000E+000 0.966843409734769E-002 0.000000000000000E+000 0.000000000000000E+000 0.460401623683504E-002 0.000000000000000E+000 0.000000000000000E+000 0.460401623683726E-002 0.000000000000000E+000 0.000000000000000E+000 0.966843409735141E-002 0.000000000000000E+000 0.000000000000000E+000 0.159605896210193E-001 0.000000000000000E+000 0.000000000000000E+000 0.957635377260806E-001 0.000000000000000E+000 0.000000000000000E+000 0.121822269626542E+000 0.000000000000000E+000 0.000000000000000E+000 0.957635377260778E-001 0.000000000000000E+000 0.000000000000000E+000 0.580106045840678E-001 0.000000000000000E+000 0.000000000000000E+000 0.276240974209884E-001 0.000000000000000E+000 0.000000000000000E+000 0.580106045840700E-001 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.284217094304040E-013 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 -0.439223148993639E+000 0.000000000000000E+000 0.000000000000000E+000 -0.562488010374383E+000 0.000000000000000E+000 0.000000000000000E+000 -0.464084836672524E+000 0.000000000000000E+000 0.000000000000000E+000 -0.226517598852065E+000 0.000000000000000E+000 0.000000000000000E+000 0.794960136892755E-001 0.000000000000000E+000 0.000000000000000E+000 0.395024593120065E+000 0.000000000000000E+000 0.000000000000000E+000 0.672923013175161E+000 0.000000000000000E+000 0.000000000000000E+000 0.877832429155701E+000 0.000000000000000E+000 0.000000000000000E+000 0.986180277929117E+000 0.000000000000000E+000 0.000000000000000E+000 0.986180277929119E+000 0.000000000000000E+000 0.000000000000000E+000 0.877832429155703E+000 0.000000000000000E+000 0.000000000000000E+000 0.672923013175167E+000 0.000000000000000E+000 0.000000000000000E+000 0.395024593120073E+000 0.000000000000000E+000 0.000000000000000E+000 0.794960136892868E-001 0.000000000000000E+000 0.000000000000000E+000 -0.226517598852048E+000 0.000000000000000E+000 0.000000000000000E+000 -0.464084836672512E+000 0.000000000000000E+000 0.000000000000000E+000 -0.562488010374366E+000 0.000000000000000E+000 0.000000000000000E+000 -0.439223148993619E+000 0.000000000000000E+000 0.000000000000000E+000 0.210348006962958E-013 0.000000000000000E+000 0.000000000000000E+000 0.217307110400020E-013 0.000000000000000E+000 0.000000000000000E+000 0.143386844317059E-013 0.000000000000000E+000 0.000000000000000E+000 0.208848710491643E-013 0.000000000000000E+000 0.000000000000000E+000 0.173819108598890E-013 0.000000000000000E+000 0.000000000000000E+000 0.113780118912141E-013 0.000000000000000E+000 0.000000000000000E+000 0.931639330631646E-014 0.000000000000000E+000 0.000000000000000E+000 0.107621256761647E-013 0.000000000000000E+000 0.000000000000000E+000 0.684781874504404E-014 0.000000000000000E+000 0.000000000000000E+000 0.514261718216008E-014 0.000000000000000E+000 0.000000000000000E+000 0.478320483003490E-014 0.000000000000000E+000 0.000000000000000E+000 0.269105364240816E-014 0.000000000000000E+000 0.000000000000000E+000 0.245420788123829E-014 0.000000000000000E+000 0.000000000000000E+000 0.233687545075082E-014 0.000000000000000E+000 0.000000000000000E+000 0.194076604518931E-014 0.000000000000000E+000 0.000000000000000E+000 0.109486812419020E-014 0.000000000000000E+000 0.000000000000000E+000 0.410560425095361E-015 0.000000000000000E+000 0.000000000000000E+000 0.881222114801000E-016 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 -0.383514552527989E+000 0.000000000000000E+000 0.000000000000000E+000 -0.383514552527971E+000 0.000000000000000E+000 0.000000000000000E+000 0.690602435524585E-002 0.000000000000000E+000 0.000000000000000E+000 -0.486184114609311E+000 0.000000000000000E+000 0.000000000000000E+000 -0.396405797991114E+000 0.000000000000000E+000 0.000000000000000E+000 -0.190790432854260E+000 0.000000000000000E+000 0.000000000000000E+000 0.658374321866781E-001 0.000000000000000E+000 0.000000000000000E+000 0.320439530083410E+000 0.000000000000000E+000 0.000000000000000E+000 0.531763875353935E+000 0.000000000000000E+000 0.000000000000000E+000 0.670344764082536E+000 0.000000000000000E+000 0.000000000000000E+000 0.718502773919786E+000 0.000000000000000E+000 0.000000000000000E+000 0.670344764082541E+000 0.000000000000000E+000 0.000000000000000E+000 0.531763875353937E+000 0.000000000000000E+000 0.000000000000000E+000 0.320439530083417E+000 0.000000000000000E+000 0.000000000000000E+000 0.658374321866855E-001 0.000000000000000E+000 0.000000000000000E+000 -0.190790432854247E+000 0.000000000000000E+000 0.000000000000000E+000 -0.396405797991097E+000 0.000000000000000E+000 0.000000000000000E+000 -0.486184114609299E+000 0.000000000000000E+000 0.000000000000000E+000 -0.331489169051790E+000 0.000000000000000E+000 0.000000000000000E+000 -0.283146998565064E+000 0.000000000000000E+000 0.000000000000000E+000 -0.238488041067809E+000 0.000000000000000E+000 0.000000000000000E+000 -0.197512296560023E+000 0.000000000000000E+000 0.000000000000000E+000 -0.160219765041695E+000 0.000000000000000E+000 0.000000000000000E+000 -0.126610446512834E+000 0.000000000000000E+000 0.000000000000000E+000 -0.966843409734348E-001 0.000000000000000E+000 0.000000000000000E+000 -0.704414484235017E-001 0.000000000000000E+000 0.000000000000000E+000 -0.478817688630357E-001 0.000000000000000E+000 0.000000000000000E+000 -0.290053022920287E-001 0.000000000000000E+000 0.000000000000000E+000 -0.138120487104883E-001 0.000000000000000E+000 0.000000000000000E+000 -0.230200811841392E-002 0.000000000000000E+000 0.000000000000000E+000 0.552481948419819E-002 0.000000000000000E+000 0.000000000000000E+000 0.966843409734531E-002 0.000000000000000E+000 0.000000000000000E+000 0.101288357210276E-001 0.000000000000000E+000 0.000000000000000E+000 0.101288357210273E-001 0.000000000000000E+000 0.000000000000000E+000 0.966843409734437E-002 0.000000000000000E+000 0.000000000000000E+000 0.552481948419676E-002 0.000000000000000E+000 0.000000000000000E+000 -0.230200811841513E-002 0.000000000000000E+000 0.000000000000000E+000 -0.138120487104916E-001 0.000000000000000E+000 0.000000000000000E+000 -0.290053022920325E-001 0.000000000000000E+000 0.000000000000000E+000 -0.478817688630380E-001 0.000000000000000E+000 0.000000000000000E+000 -0.704414484235079E-001 0.000000000000000E+000 0.000000000000000E+000 -0.966843409734423E-001 0.000000000000000E+000 0.000000000000000E+000 -0.126610446512841E+000 0.000000000000000E+000 0.000000000000000E+000 -0.160219765041705E+000 0.000000000000000E+000 0.000000000000000E+000 -0.197512296560032E+000 0.000000000000000E+000 0.000000000000000E+000 -0.238488041067825E+000 0.000000000000000E+000 0.000000000000000E+000 -0.283146998565082E+000 0.000000000000000E+000 0.000000000000000E+000 -0.331489169051803E+000 0.000000000000000E+000 0.000000000000000E+000 -0.415282264562120E+000 0.000000000000000E+000 0.000000000000000E+000 -0.415282264562101E+000 0.000000000000000E+000 0.000000000000000E+000 0.148556257241741E-001 0.000000000000000E+000 0.000000000000000E+000 -0.333883257494955E+000 0.000000000000000E+000 0.000000000000000E+000 -0.158009837248026E+000 0.000000000000000E+000 0.000000000000000E+000 0.534065883472353E-001 0.000000000000000E+000 0.000000000000000E+000 0.253220893025683E+000 0.000000000000000E+000 0.000000000000000E+000 0.406074232088461E+000 0.000000000000000E+000 0.000000000000000E+000 0.488394042402992E+000 0.000000000000000E+000 0.000000000000000E+000 0.488394042402993E+000 0.000000000000000E+000 0.000000000000000E+000 0.406074232088462E+000 0.000000000000000E+000 0.000000000000000E+000 0.253220893025687E+000 0.000000000000000E+000 0.000000000000000E+000 0.534065883472413E-001 0.000000000000000E+000 0.000000000000000E+000 -0.158009837248017E+000 0.000000000000000E+000 0.000000000000000E+000 -0.333883257494941E+000 0.000000000000000E+000 0.000000000000000E+000 -0.349782460232796E+000 0.000000000000000E+000 0.000000000000000E+000 -0.289684701621371E+000 0.000000000000000E+000 0.000000000000000E+000 -0.234988988727824E+000 0.000000000000000E+000 0.000000000000000E+000 -0.185695321552163E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094374E+000 0.000000000000000E+000 0.000000000000000E+000 -0.103314124354473E+000 0.000000000000000E+000 0.000000000000000E+000 -0.702265943324511E-001 0.000000000000000E+000 0.000000000000000E+000 -0.425411100283106E-001 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420530E-001 0.000000000000000E+000 0.000000000000000E+000 -0.337627857367406E-002 0.000000000000000E+000 0.000000000000000E+000 0.810306857682338E-002 0.000000000000000E+000 0.000000000000000E+000 0.141803700094389E-001 0.000000000000000E+000 0.000000000000000E+000 0.141803700094389E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857682234E-002 0.000000000000000E+000 0.000000000000000E+000 -0.337627857367526E-002 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420539E-001 0.000000000000000E+000 0.000000000000000E+000 -0.425411100283144E-001 0.000000000000000E+000 0.000000000000000E+000 -0.702265943324556E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103314124354478E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094382E+000 0.000000000000000E+000 0.000000000000000E+000 -0.185695321552167E+000 0.000000000000000E+000 0.000000000000000E+000 -0.234988988727833E+000 0.000000000000000E+000 0.000000000000000E+000 -0.289684701621381E+000 0.000000000000000E+000 0.000000000000000E+000 -0.349782460232810E+000 0.000000000000000E+000 0.000000000000000E+000 -0.276517215184045E+000 0.000000000000000E+000 0.000000000000000E+000 -0.276517215184036E+000 0.000000000000000E+000 0.000000000000000E+000 0.135358077362831E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128175812033364E+000 0.000000000000000E+000 0.000000000000000E+000 0.422034821709477E-001 0.000000000000000E+000 0.000000000000000E+000 0.193368681946886E+000 0.000000000000000E+000 0.000000000000000E+000 0.295854083378736E+000 0.000000000000000E+000 0.000000000000000E+000 0.331980264117067E+000 0.000000000000000E+000 0.000000000000000E+000 0.295854083378737E+000 0.000000000000000E+000 0.000000000000000E+000 0.193368681946889E+000 0.000000000000000E+000 0.000000000000000E+000 0.422034821709505E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128175812033357E+000 0.000000000000000E+000 0.000000000000000E+000 -0.224307671058378E+000 0.000000000000000E+000 0.000000000000000E+000 -0.177254625117973E+000 0.000000000000000E+000 0.000000000000000E+000 -0.135358077362811E+000 0.000000000000000E+000 0.000000000000000E+000 -0.986180277929068E-001 0.000000000000000E+000 0.000000000000000E+000 -0.670344764082493E-001 0.000000000000000E+000 0.000000000000000E+000 -0.406074232088420E-001 0.000000000000000E+000 0.000000000000000E+000 -0.193368681946864E-001 0.000000000000000E+000 0.000000000000000E+000 -0.322281136577941E-002 0.000000000000000E+000 0.000000000000000E+000 0.773474727787664E-002 0.000000000000000E+000 0.000000000000000E+000 0.773474727787624E-002 0.000000000000000E+000 0.000000000000000E+000 -0.322281136578049E-002 0.000000000000000E+000 0.000000000000000E+000 -0.193368681946875E-001 0.000000000000000E+000 0.000000000000000E+000 -0.406074232088450E-001 0.000000000000000E+000 0.000000000000000E+000 -0.670344764082528E-001 0.000000000000000E+000 0.000000000000000E+000 -0.986180277929109E-001 0.000000000000000E+000 0.000000000000000E+000 -0.135358077362819E+000 0.000000000000000E+000 0.000000000000000E+000 -0.177254625117977E+000 0.000000000000000E+000 0.000000000000000E+000 -0.224307671058386E+000 0.000000000000000E+000 0.000000000000000E+000 -0.101288357210273E+000 0.000000000000000E+000 0.000000000000000E+000 -0.101288357210266E+000 0.000000000000000E+000 0.000000000000000E+000 0.441985558735864E-002 0.000000000000000E+000 0.000000000000000E+000 0.322281136578149E-001 0.000000000000000E+000 0.000000000000000E+000 0.140882896847017E+000 0.000000000000000E+000 0.000000000000000E+000 0.201103429224763E+000 0.000000000000000E+000 0.000000000000000E+000 0.201103429224763E+000 0.000000000000000E+000 0.000000000000000E+000 0.140882896847021E+000 0.000000000000000E+000 0.000000000000000E+000 0.322281136578208E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787452E-001 0.000000000000000E+000 0.000000000000000E+000 -0.563531587388017E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904271E-001 0.000000000000000E+000 0.000000000000000E+000 -0.232042418336230E-001 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683912E-001 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473107E-002 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473118E-002 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683921E-001 0.000000000000000E+000 0.000000000000000E+000 -0.232042418336255E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904296E-001 0.000000000000000E+000 0.000000000000000E+000 -0.563531587388059E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787537E-001 0.000000000000000E+000 0.000000000000000E+000 0.234804828078375E-001 0.000000000000000E+000 0.000000000000000E+000 0.234804828078414E-001 0.000000000000000E+000 0.000000000000000E+000 0.767336039473525E-003 0.000000000000000E+000 0.000000000000000E+000 0.957635377260774E-001 0.000000000000000E+000 0.000000000000000E+000 0.121822269626540E+000 0.000000000000000E+000 0.000000000000000E+000 0.957635377260789E-001 0.000000000000000E+000 0.000000000000000E+000 0.159605896210158E-001 0.000000000000000E+000 0.000000000000000E+000 0.966843409734689E-002 0.000000000000000E+000 0.000000000000000E+000 0.460401623683193E-002 0.000000000000000E+000 0.000000000000000E+000 0.460401623683193E-002 0.000000000000000E+000 0.000000000000000E+000 0.966843409734582E-002 0.000000000000000E+000 0.000000000000000E+000 0.159605896210142E-001 0.000000000000000E+000 0.000000000000000E+000 0.580106045840666E-001 0.000000000000000E+000 0.000000000000000E+000 0.580106045840673E-001 0.000000000000000E+000 0.000000000000000E+000 0.276240974209848E-001 + + + + + + + + + + diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N13.vtp b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N13.vtp new file mode 100644 index 00000000..b2985dd4 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/Order4_N13.vtp @@ -0,0 +1,29 @@ + + + + + + + + + + + 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.100000000000000E+001 0.142108547152020E-013 0.526315789473684E-001 0.000000000000000E+000 0.000000000000000E+000 0.105263157894737E+000 0.000000000000000E+000 0.000000000000000E+000 0.157894736842105E+000 0.000000000000000E+000 0.000000000000000E+000 0.210526315789474E+000 0.000000000000000E+000 0.000000000000000E+000 0.263157894736842E+000 0.000000000000000E+000 0.000000000000000E+000 0.315789473684211E+000 0.000000000000000E+000 0.000000000000000E+000 0.368421052631579E+000 0.000000000000000E+000 0.000000000000000E+000 0.421052631578947E+000 0.000000000000000E+000 0.000000000000000E+000 0.473684210526316E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473684E+000 0.000000000000000E+000 0.000000000000000E+000 0.578947368421053E+000 0.000000000000000E+000 0.000000000000000E+000 0.631578947368421E+000 0.000000000000000E+000 0.000000000000000E+000 0.684210526315789E+000 0.000000000000000E+000 0.000000000000000E+000 0.736842105263158E+000 0.000000000000000E+000 0.000000000000000E+000 0.789473684210526E+000 0.000000000000000E+000 0.000000000000000E+000 0.842105263157895E+000 0.000000000000000E+000 0.000000000000000E+000 0.894736842105263E+000 0.000000000000000E+000 0.000000000000000E+000 0.947368421052632E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.526315789473684E-001 -0.256670397893768E-014 0.100000000000000E+001 0.105263157894737E+000 -0.472133739433688E-014 0.100000000000000E+001 0.157894736842105E+000 -0.669687347427353E-014 0.100000000000000E+001 0.210526315789474E+000 -0.848392762203065E-014 0.100000000000000E+001 0.263157894736842E+000 -0.960132216636420E-014 0.100000000000000E+001 0.315789473684211E+000 -0.106160835972191E-013 0.100000000000000E+001 0.368421052631579E+000 -0.106515122924887E-013 0.100000000000000E+001 0.421052631578947E+000 -0.113978631944729E-013 0.100000000000000E+001 0.473684210526316E+000 -0.114270787379436E-013 0.100000000000000E+001 0.526315789473684E+000 -0.119566967196572E-013 0.100000000000000E+001 0.578947368421053E+000 -0.920781514551772E-014 0.100000000000000E+001 0.631578947368421E+000 -0.909704358978335E-014 0.100000000000000E+001 0.684210526315789E+000 -0.599423599057158E-014 0.100000000000000E+001 0.736842105263158E+000 -0.344665377619560E-014 0.100000000000000E+001 0.789473684210526E+000 -0.500112219492957E-014 0.100000000000000E+001 0.842105263157895E+000 0.237530018606032E-014 0.100000000000000E+001 0.894736842105263E+000 0.270216260277610E-014 0.100000000000000E+001 0.947368421052632E+000 0.901327884812958E-014 0.947368421052632E+000 0.947368421052632E+000 0.663714980701515E+000 0.894736842105263E+000 0.894736842105263E+000 0.102270547340798E+001 0.842105263157895E+000 0.842105263157895E+000 0.114916245271293E+001 0.789473684210526E+000 0.789473684210526E+000 0.110741937216566E+001 0.736842105263158E+000 0.736842105263158E+000 0.953952164271303E+000 0.684210526315789E+000 0.684210526315789E+000 0.737379240490794E+000 0.631578947368421E+000 0.631578947368421E+000 0.498461491240864E+000 0.578947368421053E+000 0.578947368421053E+000 0.270102285894066E+000 0.526315789473684E+000 0.526315789473684E+000 0.773474727787579E-001 0.473684210526316E+000 0.473684210526316E+000 -0.626146208208936E-001 0.421052631578947E+000 0.421052631578947E+000 -0.140453188664910E+000 0.368421052631579E+000 0.368421052631579E+000 -0.154694945557507E+000 0.315789473684211E+000 0.315789473684211E+000 -0.111724127347088E+000 0.263157894736842E+000 0.263157894736842E+000 -0.257824909262507E-001 0.210526315789474E+000 0.210526315789474E+000 0.810306857682191E-001 0.157894736842105E+000 0.157894736842105E+000 0.178758603755343E+000 0.105263157894737E+000 0.105263157894737E+000 0.229586943009952E+000 0.526315789473685E-001 0.526315789473685E-001 0.187843862462688E+000 0.105263157894737E+000 0.526315789473684E-001 0.177408092325872E+000 0.947368421052632E+000 0.526315789473684E-001 0.104357701368138E-001 0.947368421052632E+000 0.894736842105263E+000 0.511352736703993E+000 0.157894736842105E+000 0.526315789473684E-001 0.166972322189056E+000 0.210526315789474E+000 0.526315789473684E-001 0.156536552052240E+000 0.263157894736842E+000 0.526315789473684E-001 0.146100781915424E+000 0.315789473684211E+000 0.526315789473684E-001 0.135665011778608E+000 0.368421052631579E+000 0.526315789473684E-001 0.125229241641792E+000 0.421052631578947E+000 0.526315789473684E-001 0.114793471504976E+000 0.473684210526316E+000 0.526315789473684E-001 0.104357701368160E+000 0.526315789473684E+000 0.526315789473684E-001 0.939219312313440E-001 0.578947368421053E+000 0.526315789473684E-001 0.834861610945278E-001 0.631578947368421E+000 0.526315789473684E-001 0.730503909577116E-001 0.684210526315789E+000 0.526315789473684E-001 0.626146208208954E-001 0.736842105263158E+000 0.526315789473684E-001 0.521788506840792E-001 0.789473684210526E+000 0.526315789473684E-001 0.417430805472628E-001 0.842105263157895E+000 0.526315789473684E-001 0.313073104104465E-001 0.894736842105263E+000 0.526315789473684E-001 0.208715402736302E-001 0.947368421052632E+000 0.105263157894737E+000 0.135051142946991E-001 0.947368421052631E+000 0.157894736842105E+000 0.111724127347033E-001 0.947368421052632E+000 0.210526315789474E+000 0.540204571787419E-002 0.947368421052631E+000 0.263157894736842E+000 -0.184160649474077E-002 0.947368421052632E+000 0.315789473684211E+000 -0.859416364209249E-002 0.947368421052632E+000 0.368421052631579E+000 -0.128912454631350E-001 0.947368421052632E+000 0.421052631578947E+000 -0.127684716968193E-001 0.947368421052632E+000 0.473684210526316E+000 -0.626146208209854E-002 0.947368421052632E+000 0.526315789473684E+000 0.859416364207414E-002 0.947368421052632E+000 0.578947368421053E+000 0.337627857367512E-001 0.947368421052632E+000 0.631578947368421E+000 0.712087844629756E-001 0.947368421052632E+000 0.684210526315789E+000 0.122896540081793E+000 0.947368421052632E+000 0.736842105263158E+000 0.190790432854257E+000 0.947368421052632E+000 0.789473684210526E+000 0.276854843041408E+000 0.947368421052632E+000 0.842105263157895E+000 0.383054150904303E+000 0.894736842105263E+000 0.842105263157895E+000 0.766108301808620E+000 0.842105263157895E+000 0.789473684210526E+000 0.830564529124241E+000 0.789473684210526E+000 0.736842105263158E+000 0.763161731417040E+000 0.736842105263158E+000 0.684210526315789E+000 0.614482700408991E+000 0.684210526315789E+000 0.631578947368421E+000 0.427252706777884E+000 0.631578947368421E+000 0.578947368421053E+000 0.236339500157307E+000 0.578947368421053E+000 0.526315789473684E+000 0.687533091366740E-001 0.526315789473684E+000 0.473684210526316E+000 -0.563531587388047E-001 0.473684210526316E+000 0.421052631578947E+000 -0.127684716968100E+000 0.421052631578947E+000 0.368421052631579E+000 -0.141803700094382E+000 0.368421052631579E+000 0.315789473684211E+000 -0.103129963705004E+000 0.315789473684211E+000 0.263157894736842E+000 -0.239408844315183E-001 0.263157894736842E+000 0.210526315789474E+000 0.756286400503376E-001 0.210526315789474E+000 0.157894736842105E+000 0.167586191020634E+000 0.157894736842105E+000 0.105263157894737E+000 0.216081828715250E+000 0.210526315789474E+000 0.105263157894737E+000 0.202576714420547E+000 0.894736842105263E+000 0.105263157894737E+000 0.270102285894028E-001 0.894736842105263E+000 0.789473684210526E+000 0.553709686082828E+000 0.263157894736842E+000 0.105263157894737E+000 0.189071600125844E+000 0.315789473684211E+000 0.105263157894737E+000 0.175566485831140E+000 0.368421052631579E+000 0.105263157894737E+000 0.162061371536437E+000 0.421052631578947E+000 0.105263157894737E+000 0.148556257241734E+000 0.473684210526316E+000 0.105263157894737E+000 0.135051142947031E+000 0.526315789473684E+000 0.105263157894737E+000 0.121546028652327E+000 0.578947368421053E+000 0.105263157894737E+000 0.108040914357624E+000 0.631578947368421E+000 0.105263157894737E+000 0.945358000629207E-001 0.684210526315789E+000 0.105263157894737E+000 0.810306857682172E-001 0.736842105263158E+000 0.105263157894737E+000 0.675255714735137E-001 0.789473684210526E+000 0.105263157894737E+000 0.540204571788102E-001 0.842105263157895E+000 0.105263157894737E+000 0.405153428841065E-001 0.894736842105263E+000 0.157894736842105E+000 0.223448254694131E-001 0.894736842105263E+000 0.210526315789474E+000 0.108040914357567E-001 0.894736842105263E+000 0.263157894736842E+000 -0.368321298947106E-002 0.894736842105263E+000 0.315789473684211E+000 -0.171883272841749E-001 0.894736842105263E+000 0.368421052631579E+000 -0.257824909262588E-001 0.894736842105263E+000 0.421052631578947E+000 -0.255369433936284E-001 0.894736842105263E+000 0.473684210526316E+000 -0.125229241641856E-001 0.894736842105263E+000 0.526315789473684E+000 0.171883272841614E-001 0.894736842105263E+000 0.578947368421053E+000 0.675255714735107E-001 0.894736842105263E+000 0.631578947368421E+000 0.142417568925956E+000 0.894736842105263E+000 0.684210526315789E+000 0.245793080163591E+000 0.894736842105263E+000 0.736842105263158E+000 0.381580865708519E+000 0.842105263157895E+000 0.736842105263158E+000 0.572371298562780E+000 0.789473684210526E+000 0.684210526315789E+000 0.491586160327194E+000 0.736842105263158E+000 0.631578947368421E+000 0.356043922314900E+000 0.684210526315789E+000 0.578947368421053E+000 0.202576714420547E+000 0.631578947368421E+000 0.526315789473684E+000 0.601591454945867E-001 0.578947368421053E+000 0.473684210526316E+000 -0.500916966567159E-001 0.526315789473684E+000 0.421052631578947E+000 -0.114916245271291E+000 0.473684210526316E+000 0.368421052631579E+000 -0.128912454631256E+000 0.421052631578947E+000 0.315789473684211E+000 -0.945358000629208E-001 0.368421052631579E+000 0.263157894736842E+000 -0.220992779367864E-001 0.315789473684211E+000 0.210526315789474E+000 0.702265943324567E-001 0.263157894736842E+000 0.157894736842105E+000 0.156413778285925E+000 0.315789473684211E+000 0.157894736842105E+000 0.145241365551216E+000 0.842105263157895E+000 0.157894736842105E+000 0.335172382041229E-001 0.842105263157895E+000 0.684210526315789E+000 0.368689620245394E+000 0.368421052631579E+000 0.157894736842105E+000 0.134068952816507E+000 0.421052631578947E+000 0.157894736842105E+000 0.122896540081798E+000 0.473684210526316E+000 0.157894736842105E+000 0.111724127347089E+000 0.526315789473684E+000 0.157894736842105E+000 0.100551714612380E+000 0.578947368421053E+000 0.157894736842105E+000 0.893793018776705E-001 0.631578947368421E+000 0.157894736842105E+000 0.782068891429612E-001 0.684210526315790E+000 0.157894736842105E+000 0.670344764082517E-001 0.736842105263158E+000 0.157894736842105E+000 0.558620636735422E-001 0.789473684210526E+000 0.157894736842105E+000 0.446896509388325E-001 0.842105263157895E+000 0.210526315789474E+000 0.162061371536391E-001 0.842105263157895E+000 0.263157894736842E+000 -0.552481948420237E-002 0.842105263157895E+000 0.315789473684210E+000 -0.257824909262568E-001 0.842105263157895E+000 0.368421052631579E+000 -0.386737363893833E-001 0.842105263157895E+000 0.421052631578947E+000 -0.383054150904367E-001 0.842105263157894E+000 0.473684210526316E+000 -0.187843862462742E-001 0.842105263157894E+000 0.526315789473684E+000 0.257824909262462E-001 0.842105263157894E+000 0.578947368421052E+000 0.101288357210267E+000 0.842105263157894E+000 0.631578947368421E+000 0.213626353388936E+000 0.789473684210526E+000 0.631578947368421E+000 0.284835137851920E+000 0.736842105263158E+000 0.578947368421053E+000 0.168813928683788E+000 0.684210526315789E+000 0.526315789473684E+000 0.515649818525011E-001 0.631578947368421E+000 0.473684210526316E+000 -0.438302345746279E-001 0.578947368421053E+000 0.421052631578947E+000 -0.102147773574481E+000 0.526315789473684E+000 0.368421052631579E+000 -0.116021209168131E+000 0.473684210526316E+000 0.315789473684211E+000 -0.859416364208373E-001 0.421052631578947E+000 0.263157894736842E+000 -0.202576714420542E-001 0.368421052631579E+000 0.210526315789474E+000 0.648245486145753E-001 0.421052631578947E+000 0.210526315789474E+000 0.594225028966941E-001 0.789473684210526E+000 0.210526315789474E+000 0.216081828715214E-001 0.789473684210526E+000 0.578947368421053E+000 0.135051142947030E+000 0.473684210526316E+000 0.210526315789474E+000 0.540204571788126E-001 0.526315789473684E+000 0.210526315789474E+000 0.486184114609310E-001 0.578947368421053E+000 0.210526315789474E+000 0.432163657430491E-001 0.631578947368421E+000 0.210526315789474E+000 0.378143200251673E-001 0.684210526315789E+000 0.210526315789474E+000 0.324122743072855E-001 0.736842105263158E+000 0.210526315789474E+000 0.270102285894034E-001 0.789473684210526E+000 0.263157894736842E+000 -0.736642597893314E-002 0.789473684210526E+000 0.315789473684211E+000 -0.343766545683393E-001 0.789473684210526E+000 0.368421052631579E+000 -0.515649818525076E-001 0.789473684210526E+000 0.421052631578947E+000 -0.510738867872443E-001 0.789473684210526E+000 0.473684210526316E+000 -0.250458483283625E-001 0.789473684210526E+000 0.526315789473684E+000 0.343766545683349E-001 0.736842105263158E+000 0.526315789473684E+000 0.429708182104167E-001 0.684210526315789E+000 0.473684210526316E+000 -0.375687724925390E-001 0.631578947368421E+000 0.421052631578947E+000 -0.893793018776710E-001 0.578947368421053E+000 0.368421052631579E+000 -0.103129963705006E+000 0.526315789473684E+000 0.315789473684211E+000 -0.773474727787538E-001 0.473684210526316E+000 0.263157894736842E+000 -0.184160649473221E-001 0.526315789473684E+000 0.263157894736842E+000 -0.165744584525904E-001 0.736842105263158E+000 0.263157894736842E+000 -0.920803247366436E-002 0.736842105263158E+000 0.473684210526316E+000 -0.313073104104510E-001 0.578947368421053E+000 0.263157894736842E+000 -0.147328519578589E-001 0.631578947368421E+000 0.263157894736842E+000 -0.128912454631273E-001 0.684210526315789E+000 0.263157894736842E+000 -0.110496389683959E-001 0.736842105263158E+000 0.315789473684211E+000 -0.429708182104221E-001 0.736842105263158E+000 0.368421052631579E+000 -0.644562273156311E-001 0.736842105263158E+000 0.421052631578947E+000 -0.638423584840534E-001 0.684210526315789E+000 0.421052631578947E+000 -0.766108301808622E-001 0.631578947368421E+000 0.368421052631579E+000 -0.902387182418805E-001 0.578947368421053E+000 0.315789473684211E+000 -0.687533091366707E-001 0.631578947368421E+000 0.315789473684211E+000 -0.601591454945875E-001 0.684210526315789E+000 0.315789473684211E+000 -0.515649818525047E-001 0.684210526315789E+000 0.368421052631579E+000 -0.773474727787555E-001 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.100000000000000E+001 0.100000000000000E+001 -0.710542735760100E-014 0.000000000000000E+000 0.100000000000000E+001 0.000000000000000E+000 0.526315789473684E-001 0.526315789473684E-001 0.187843862462688E+000 0.105263157894737E+000 0.105263157894737E+000 0.229586943009952E+000 0.157894736842105E+000 0.157894736842105E+000 0.178758603755343E+000 0.210526315789474E+000 0.210526315789474E+000 0.810306857682187E-001 0.263157894736842E+000 0.263157894736842E+000 -0.257824909262512E-001 0.315789473684211E+000 0.315789473684211E+000 -0.111724127347089E+000 0.368421052631579E+000 0.368421052631579E+000 -0.154694945557508E+000 0.421052631578947E+000 0.421052631578947E+000 -0.140453188664911E+000 0.473684210526316E+000 0.473684210526316E+000 -0.626146208208954E-001 0.526315789473684E+000 0.526315789473684E+000 0.773474727787531E-001 0.578947368421053E+000 0.578947368421053E+000 0.270102285894063E+000 0.631578947368421E+000 0.631578947368421E+000 0.498461491240861E+000 0.684210526315789E+000 0.684210526315789E+000 0.737379240490786E+000 0.736842105263158E+000 0.736842105263158E+000 0.953952164271302E+000 0.789473684210526E+000 0.789473684210526E+000 0.110741937216565E+001 0.842105263157895E+000 0.842105263157895E+000 0.114916245271292E+001 0.894736842105263E+000 0.894736842105263E+000 0.102270547340797E+001 0.947368421052632E+000 0.947368421052632E+000 0.663714980701494E+000 0.947368421052632E+000 0.100000000000000E+001 0.223050715522772E-014 0.894736842105263E+000 0.100000000000000E+001 -0.653218228490458E-015 0.842105263157895E+000 0.100000000000000E+001 0.737589533010945E-015 0.789473684210526E+000 0.100000000000000E+001 -0.315523780296061E-014 0.736842105263158E+000 0.100000000000000E+001 -0.316323443700870E-014 0.684210526315789E+000 0.100000000000000E+001 -0.195944113899395E-014 0.631578947368421E+000 0.100000000000000E+001 0.148471709671817E-014 0.578947368421053E+000 0.100000000000000E+001 0.353111595155754E-015 0.526315789473684E+000 0.100000000000000E+001 0.857102863693347E-015 0.473684210526316E+000 0.100000000000000E+001 0.310800995488509E-016 0.421052631578947E+000 0.100000000000000E+001 0.239375378218891E-015 0.368421052631579E+000 0.100000000000000E+001 -0.158001675580925E-017 0.315789473684211E+000 0.100000000000000E+001 -0.324110734047959E-015 0.263157894736842E+000 0.100000000000000E+001 0.104052792894251E-016 0.210526315789474E+000 0.100000000000000E+001 -0.108909271427293E-015 0.157894736842105E+000 0.100000000000000E+001 -0.126724783866043E-015 0.105263157894737E+000 0.100000000000000E+001 -0.106713817699157E-015 0.526315789473685E-001 0.100000000000000E+001 -0.411311511646058E-016 0.000000000000000E+000 0.947368421052632E+000 0.000000000000000E+000 0.000000000000000E+000 0.894736842105263E+000 0.000000000000000E+000 0.000000000000000E+000 0.842105263157895E+000 0.000000000000000E+000 0.000000000000000E+000 0.789473684210526E+000 0.000000000000000E+000 0.000000000000000E+000 0.736842105263158E+000 0.000000000000000E+000 0.000000000000000E+000 0.684210526315789E+000 0.000000000000000E+000 0.000000000000000E+000 0.631578947368421E+000 0.000000000000000E+000 0.000000000000000E+000 0.578947368421053E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473684E+000 0.000000000000000E+000 0.000000000000000E+000 0.473684210526316E+000 0.000000000000000E+000 0.000000000000000E+000 0.421052631578947E+000 0.000000000000000E+000 0.000000000000000E+000 0.368421052631579E+000 0.000000000000000E+000 0.000000000000000E+000 0.315789473684211E+000 0.000000000000000E+000 0.000000000000000E+000 0.263157894736842E+000 0.000000000000000E+000 0.000000000000000E+000 0.210526315789474E+000 0.000000000000000E+000 0.000000000000000E+000 0.157894736842105E+000 0.000000000000000E+000 0.000000000000000E+000 0.105263157894737E+000 0.000000000000000E+000 0.000000000000000E+000 0.526315789473685E-001 0.000000000000000E+000 0.526315789473684E-001 0.105263157894737E+000 0.177408092325872E+000 0.894736842105263E+000 0.947368421052632E+000 0.511352736703982E+000 0.526315789473684E-001 0.947368421052632E+000 0.104357701368160E-001 0.105263157894737E+000 0.157894736842105E+000 0.216081828715249E+000 0.157894736842105E+000 0.210526315789474E+000 0.167586191020634E+000 0.210526315789474E+000 0.263157894736842E+000 0.756286400503375E-001 0.263157894736842E+000 0.315789473684211E+000 -0.239408844315190E-001 0.315789473684211E+000 0.368421052631579E+000 -0.103129963705005E+000 0.368421052631579E+000 0.421052631578947E+000 -0.141803700094382E+000 0.421052631578947E+000 0.473684210526316E+000 -0.127684716968101E+000 0.473684210526316E+000 0.526315789473684E+000 -0.563531587388058E-001 0.526315789473684E+000 0.578947368421053E+000 0.687533091366693E-001 0.578947368421053E+000 0.631578947368421E+000 0.236339500157305E+000 0.631578947368421E+000 0.684210526315789E+000 0.427252706777881E+000 0.684210526315789E+000 0.736842105263158E+000 0.614482700408988E+000 0.736842105263158E+000 0.789473684210526E+000 0.763161731417034E+000 0.789473684210526E+000 0.842105263157895E+000 0.830564529124237E+000 0.842105263157895E+000 0.894736842105263E+000 0.766108301808612E+000 0.842105263157895E+000 0.947368421052632E+000 0.383054150904306E+000 0.789473684210526E+000 0.947368421052631E+000 0.276854843041411E+000 0.736842105263158E+000 0.947368421052632E+000 0.190790432854261E+000 0.684210526315789E+000 0.947368421052631E+000 0.122896540081797E+000 0.631578947368421E+000 0.947368421052632E+000 0.712087844629814E-001 0.578947368421053E+000 0.947368421052632E+000 0.337627857367586E-001 0.526315789473684E+000 0.947368421052632E+000 0.859416364208299E-002 0.473684210526316E+000 0.947368421052632E+000 -0.626146208208957E-002 0.421052631578947E+000 0.947368421052632E+000 -0.127684716968098E-001 0.368421052631579E+000 0.947368421052632E+000 -0.128912454631259E-001 0.315789473684211E+000 0.947368421052632E+000 -0.859416364208375E-002 0.263157894736842E+000 0.947368421052632E+000 -0.184160649473222E-002 0.210526315789474E+000 0.947368421052632E+000 0.540204571788124E-002 0.157894736842105E+000 0.947368421052632E+000 0.111724127347087E-001 0.105263157894737E+000 0.947368421052632E+000 0.135051142947031E-001 0.526315789473684E-001 0.894736842105263E+000 0.208715402736320E-001 0.526315789473684E-001 0.842105263157895E+000 0.313073104104480E-001 0.526315789473684E-001 0.789473684210526E+000 0.417430805472640E-001 0.526315789473684E-001 0.736842105263158E+000 0.521788506840800E-001 0.526315789473684E-001 0.684210526315789E+000 0.626146208208960E-001 0.526315789473684E-001 0.631578947368421E+000 0.730503909577120E-001 0.526315789473684E-001 0.578947368421053E+000 0.834861610945281E-001 0.526315789473684E-001 0.526315789473684E+000 0.939219312313441E-001 0.526315789473684E-001 0.473684210526316E+000 0.104357701368160E+000 0.526315789473684E-001 0.421052631578947E+000 0.114793471504976E+000 0.526315789473684E-001 0.368421052631579E+000 0.125229241641792E+000 0.526315789473684E-001 0.315789473684211E+000 0.135665011778608E+000 0.526315789473684E-001 0.263157894736842E+000 0.146100781915424E+000 0.526315789473684E-001 0.210526315789474E+000 0.156536552052240E+000 0.526315789473684E-001 0.157894736842105E+000 0.166972322189056E+000 0.105263157894737E+000 0.210526315789474E+000 0.202576714420546E+000 0.789473684210526E+000 0.894736842105263E+000 0.553709686082823E+000 0.105263157894737E+000 0.894736842105263E+000 0.270102285894061E-001 0.157894736842105E+000 0.263157894736842E+000 0.156413778285925E+000 0.210526315789474E+000 0.315789473684211E+000 0.702265943324562E-001 0.263157894736842E+000 0.368421052631579E+000 -0.220992779367867E-001 0.315789473684211E+000 0.421052631578947E+000 -0.945358000629212E-001 0.368421052631579E+000 0.473684210526316E+000 -0.128912454631257E+000 0.421052631578947E+000 0.526315789473684E+000 -0.114916245271292E+000 0.473684210526316E+000 0.578947368421053E+000 -0.500916966567167E-001 0.526315789473684E+000 0.631578947368421E+000 0.601591454945878E-001 0.578947368421053E+000 0.684210526315789E+000 0.202576714420547E+000 0.631578947368421E+000 0.736842105263158E+000 0.356043922314902E+000 0.684210526315789E+000 0.789473684210526E+000 0.491586160327190E+000 0.736842105263158E+000 0.842105263157895E+000 0.572371298562777E+000 0.736842105263158E+000 0.894736842105263E+000 0.381580865708522E+000 0.684210526315789E+000 0.894736842105263E+000 0.245793080163594E+000 0.631578947368421E+000 0.894736842105263E+000 0.142417568925961E+000 0.578947368421053E+000 0.894736842105263E+000 0.675255714735166E-001 0.526315789473684E+000 0.894736842105263E+000 0.171883272841666E-001 0.473684210526316E+000 0.894736842105263E+000 -0.125229241641787E-001 0.421052631578947E+000 0.894736842105263E+000 -0.255369433936204E-001 0.368421052631579E+000 0.894736842105263E+000 -0.257824909262515E-001 0.315789473684211E+000 0.894736842105263E+000 -0.171883272841673E-001 0.263157894736842E+000 0.894736842105263E+000 -0.368321298946463E-002 0.210526315789474E+000 0.894736842105263E+000 0.108040914357625E-001 0.157894736842105E+000 0.894736842105263E+000 0.223448254694179E-001 0.105263157894737E+000 0.842105263157895E+000 0.405153428841092E-001 0.105263157894737E+000 0.789473684210526E+000 0.540204571788123E-001 0.105263157894737E+000 0.736842105263158E+000 0.675255714735154E-001 0.105263157894737E+000 0.684210526315789E+000 0.810306857682185E-001 0.105263157894737E+000 0.631578947368421E+000 0.945358000629216E-001 0.105263157894737E+000 0.578947368421053E+000 0.108040914357625E+000 0.105263157894737E+000 0.526315789473684E+000 0.121546028652328E+000 0.105263157894737E+000 0.473684210526316E+000 0.135051142947031E+000 0.105263157894737E+000 0.421052631578947E+000 0.148556257241734E+000 0.105263157894737E+000 0.368421052631579E+000 0.162061371536437E+000 0.105263157894737E+000 0.315789473684211E+000 0.175566485831140E+000 0.105263157894737E+000 0.263157894736842E+000 0.189071600125843E+000 0.157894736842105E+000 0.315789473684211E+000 0.145241365551216E+000 0.684210526315789E+000 0.842105263157895E+000 0.368689620245392E+000 0.157894736842105E+000 0.842105263157895E+000 0.335172382041267E-001 0.210526315789474E+000 0.368421052631579E+000 0.648245486145750E-001 0.263157894736842E+000 0.421052631578947E+000 -0.202576714420545E-001 0.315789473684211E+000 0.473684210526316E+000 -0.859416364208375E-001 0.368421052631579E+000 0.526315789473684E+000 -0.116021209168131E+000 0.421052631578947E+000 0.578947368421053E+000 -0.102147773574482E+000 0.473684210526316E+000 0.631578947368421E+000 -0.438302345746269E-001 0.526315789473684E+000 0.684210526315790E+000 0.515649818525040E-001 0.578947368421053E+000 0.736842105263158E+000 0.168813928683790E+000 0.631578947368421E+000 0.789473684210526E+000 0.284835137851922E+000 0.631578947368421E+000 0.842105263157895E+000 0.213626353388941E+000 0.578947368421053E+000 0.842105263157895E+000 0.101288357210274E+000 0.526315789473684E+000 0.842105263157895E+000 0.257824909262503E-001 0.473684210526316E+000 0.842105263157895E+000 -0.187843862462682E-001 0.421052631578947E+000 0.842105263157895E+000 -0.383054150904304E-001 0.368421052631579E+000 0.842105263157894E+000 -0.386737363893777E-001 0.315789473684210E+000 0.842105263157894E+000 -0.257824909262514E-001 0.263157894736842E+000 0.842105263157894E+000 -0.552481948419693E-002 0.210526315789474E+000 0.842105263157894E+000 0.162061371536437E-001 0.157894736842105E+000 0.789473684210526E+000 0.446896509388357E-001 0.157894736842105E+000 0.736842105263158E+000 0.558620636735446E-001 0.157894736842105E+000 0.684210526315789E+000 0.670344764082535E-001 0.157894736842105E+000 0.631578947368421E+000 0.782068891429624E-001 0.157894736842105E+000 0.578947368421053E+000 0.893793018776713E-001 0.157894736842105E+000 0.526315789473684E+000 0.100551714612380E+000 0.157894736842105E+000 0.473684210526316E+000 0.111724127347089E+000 0.157894736842105E+000 0.421052631578947E+000 0.122896540081798E+000 0.157894736842105E+000 0.368421052631579E+000 0.134068952816507E+000 0.210526315789474E+000 0.421052631578947E+000 0.594225028966937E-001 0.578947368421053E+000 0.789473684210526E+000 0.135051142947031E+000 0.210526315789474E+000 0.789473684210526E+000 0.216081828715250E-001 0.263157894736842E+000 0.473684210526316E+000 -0.184160649473223E-001 0.315789473684211E+000 0.526315789473684E+000 -0.773474727787536E-001 0.368421052631579E+000 0.578947368421053E+000 -0.103129963705006E+000 0.421052631578947E+000 0.631578947368421E+000 -0.893793018776709E-001 0.473684210526316E+000 0.684210526315789E+000 -0.375687724925381E-001 0.526315789473684E+000 0.736842105263158E+000 0.429708182104174E-001 0.526315789473684E+000 0.789473684210526E+000 0.343766545683340E-001 0.473684210526316E+000 0.789473684210526E+000 -0.250458483283588E-001 0.421052631578947E+000 0.789473684210526E+000 -0.510738867872405E-001 0.368421052631579E+000 0.789473684210526E+000 -0.515649818525033E-001 0.315789473684211E+000 0.789473684210526E+000 -0.343766545683348E-001 0.263157894736842E+000 0.789473684210526E+000 -0.736642597892886E-002 0.210526315789474E+000 0.736842105263158E+000 0.270102285894063E-001 0.210526315789474E+000 0.684210526315789E+000 0.324122743072874E-001 0.210526315789474E+000 0.631578947368421E+000 0.378143200251687E-001 0.210526315789474E+000 0.578947368421053E+000 0.432163657430500E-001 0.210526315789474E+000 0.526315789473684E+000 0.486184114609312E-001 0.210526315789474E+000 0.473684210526316E+000 0.540204571788125E-001 0.263157894736842E+000 0.526315789473684E+000 -0.165744584525901E-001 0.473684210526316E+000 0.736842105263158E+000 -0.313073104104475E-001 0.263157894736842E+000 0.736842105263158E+000 -0.920803247366124E-002 0.315789473684211E+000 0.578947368421053E+000 -0.687533091366698E-001 0.368421052631579E+000 0.631578947368421E+000 -0.902387182418796E-001 0.421052631578947E+000 0.684210526315789E+000 -0.766108301808606E-001 0.421052631578947E+000 0.736842105263158E+000 -0.638423584840506E-001 0.368421052631579E+000 0.736842105263158E+000 -0.644562273156281E-001 0.315789473684211E+000 0.736842105263158E+000 -0.429708182104186E-001 0.263157894736842E+000 0.684210526315789E+000 -0.110496389683934E-001 0.263157894736842E+000 0.631578947368421E+000 -0.128912454631257E-001 0.263157894736842E+000 0.578947368421053E+000 -0.147328519578579E-001 0.315789473684211E+000 0.631578947368421E+000 -0.601591454945860E-001 0.368421052631579E+000 0.684210526315789E+000 -0.773474727787537E-001 0.315789473684211E+000 0.684210526315789E+000 -0.515649818525023E-001 + + + + + + + + 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.142108547152020E-013 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 -0.256670397893768E-014 0.000000000000000E+000 0.000000000000000E+000 -0.472133739433688E-014 0.000000000000000E+000 0.000000000000000E+000 -0.669687347427353E-014 0.000000000000000E+000 0.000000000000000E+000 -0.848392762203065E-014 0.000000000000000E+000 0.000000000000000E+000 -0.960132216636420E-014 0.000000000000000E+000 0.000000000000000E+000 -0.106160835972191E-013 0.000000000000000E+000 0.000000000000000E+000 -0.106515122924887E-013 0.000000000000000E+000 0.000000000000000E+000 -0.113978631944729E-013 0.000000000000000E+000 0.000000000000000E+000 -0.114270787379436E-013 0.000000000000000E+000 0.000000000000000E+000 -0.119566967196572E-013 0.000000000000000E+000 0.000000000000000E+000 -0.920781514551772E-014 0.000000000000000E+000 0.000000000000000E+000 -0.909704358978335E-014 0.000000000000000E+000 0.000000000000000E+000 -0.599423599057158E-014 0.000000000000000E+000 0.000000000000000E+000 -0.344665377619560E-014 0.000000000000000E+000 0.000000000000000E+000 -0.500112219492957E-014 0.000000000000000E+000 0.000000000000000E+000 0.237530018606032E-014 0.000000000000000E+000 0.000000000000000E+000 0.270216260277610E-014 0.000000000000000E+000 0.000000000000000E+000 0.901327884812958E-014 0.000000000000000E+000 0.000000000000000E+000 0.663714980701515E+000 0.000000000000000E+000 0.000000000000000E+000 0.102270547340798E+001 0.000000000000000E+000 0.000000000000000E+000 0.114916245271293E+001 0.000000000000000E+000 0.000000000000000E+000 0.110741937216566E+001 0.000000000000000E+000 0.000000000000000E+000 0.953952164271303E+000 0.000000000000000E+000 0.000000000000000E+000 0.737379240490794E+000 0.000000000000000E+000 0.000000000000000E+000 0.498461491240864E+000 0.000000000000000E+000 0.000000000000000E+000 0.270102285894066E+000 0.000000000000000E+000 0.000000000000000E+000 0.773474727787579E-001 0.000000000000000E+000 0.000000000000000E+000 -0.626146208208936E-001 0.000000000000000E+000 0.000000000000000E+000 -0.140453188664910E+000 0.000000000000000E+000 0.000000000000000E+000 -0.154694945557507E+000 0.000000000000000E+000 0.000000000000000E+000 -0.111724127347088E+000 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262507E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857682191E-001 0.000000000000000E+000 0.000000000000000E+000 0.178758603755343E+000 0.000000000000000E+000 0.000000000000000E+000 0.229586943009952E+000 0.000000000000000E+000 0.000000000000000E+000 0.187843862462688E+000 0.000000000000000E+000 0.000000000000000E+000 0.177408092325872E+000 0.000000000000000E+000 0.000000000000000E+000 0.104357701368138E-001 0.000000000000000E+000 0.000000000000000E+000 0.511352736703993E+000 0.000000000000000E+000 0.000000000000000E+000 0.166972322189056E+000 0.000000000000000E+000 0.000000000000000E+000 0.156536552052240E+000 0.000000000000000E+000 0.000000000000000E+000 0.146100781915424E+000 0.000000000000000E+000 0.000000000000000E+000 0.135665011778608E+000 0.000000000000000E+000 0.000000000000000E+000 0.125229241641792E+000 0.000000000000000E+000 0.000000000000000E+000 0.114793471504976E+000 0.000000000000000E+000 0.000000000000000E+000 0.104357701368160E+000 0.000000000000000E+000 0.000000000000000E+000 0.939219312313440E-001 0.000000000000000E+000 0.000000000000000E+000 0.834861610945278E-001 0.000000000000000E+000 0.000000000000000E+000 0.730503909577116E-001 0.000000000000000E+000 0.000000000000000E+000 0.626146208208954E-001 0.000000000000000E+000 0.000000000000000E+000 0.521788506840792E-001 0.000000000000000E+000 0.000000000000000E+000 0.417430805472628E-001 0.000000000000000E+000 0.000000000000000E+000 0.313073104104465E-001 0.000000000000000E+000 0.000000000000000E+000 0.208715402736302E-001 0.000000000000000E+000 0.000000000000000E+000 0.135051142946991E-001 0.000000000000000E+000 0.000000000000000E+000 0.111724127347033E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571787419E-002 0.000000000000000E+000 0.000000000000000E+000 -0.184160649474077E-002 0.000000000000000E+000 0.000000000000000E+000 -0.859416364209249E-002 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631350E-001 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968193E-001 0.000000000000000E+000 0.000000000000000E+000 -0.626146208209854E-002 0.000000000000000E+000 0.000000000000000E+000 0.859416364207414E-002 0.000000000000000E+000 0.000000000000000E+000 0.337627857367512E-001 0.000000000000000E+000 0.000000000000000E+000 0.712087844629756E-001 0.000000000000000E+000 0.000000000000000E+000 0.122896540081793E+000 0.000000000000000E+000 0.000000000000000E+000 0.190790432854257E+000 0.000000000000000E+000 0.000000000000000E+000 0.276854843041408E+000 0.000000000000000E+000 0.000000000000000E+000 0.383054150904303E+000 0.000000000000000E+000 0.000000000000000E+000 0.766108301808620E+000 0.000000000000000E+000 0.000000000000000E+000 0.830564529124241E+000 0.000000000000000E+000 0.000000000000000E+000 0.763161731417040E+000 0.000000000000000E+000 0.000000000000000E+000 0.614482700408991E+000 0.000000000000000E+000 0.000000000000000E+000 0.427252706777884E+000 0.000000000000000E+000 0.000000000000000E+000 0.236339500157307E+000 0.000000000000000E+000 0.000000000000000E+000 0.687533091366740E-001 0.000000000000000E+000 0.000000000000000E+000 -0.563531587388047E-001 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968100E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094382E+000 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705004E+000 0.000000000000000E+000 0.000000000000000E+000 -0.239408844315183E-001 0.000000000000000E+000 0.000000000000000E+000 0.756286400503376E-001 0.000000000000000E+000 0.000000000000000E+000 0.167586191020634E+000 0.000000000000000E+000 0.000000000000000E+000 0.216081828715250E+000 0.000000000000000E+000 0.000000000000000E+000 0.202576714420547E+000 0.000000000000000E+000 0.000000000000000E+000 0.270102285894028E-001 0.000000000000000E+000 0.000000000000000E+000 0.553709686082828E+000 0.000000000000000E+000 0.000000000000000E+000 0.189071600125844E+000 0.000000000000000E+000 0.000000000000000E+000 0.175566485831140E+000 0.000000000000000E+000 0.000000000000000E+000 0.162061371536437E+000 0.000000000000000E+000 0.000000000000000E+000 0.148556257241734E+000 0.000000000000000E+000 0.000000000000000E+000 0.135051142947031E+000 0.000000000000000E+000 0.000000000000000E+000 0.121546028652327E+000 0.000000000000000E+000 0.000000000000000E+000 0.108040914357624E+000 0.000000000000000E+000 0.000000000000000E+000 0.945358000629207E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857682172E-001 0.000000000000000E+000 0.000000000000000E+000 0.675255714735137E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788102E-001 0.000000000000000E+000 0.000000000000000E+000 0.405153428841065E-001 0.000000000000000E+000 0.000000000000000E+000 0.223448254694131E-001 0.000000000000000E+000 0.000000000000000E+000 0.108040914357567E-001 0.000000000000000E+000 0.000000000000000E+000 -0.368321298947106E-002 0.000000000000000E+000 0.000000000000000E+000 -0.171883272841749E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262588E-001 0.000000000000000E+000 0.000000000000000E+000 -0.255369433936284E-001 0.000000000000000E+000 0.000000000000000E+000 -0.125229241641856E-001 0.000000000000000E+000 0.000000000000000E+000 0.171883272841614E-001 0.000000000000000E+000 0.000000000000000E+000 0.675255714735107E-001 0.000000000000000E+000 0.000000000000000E+000 0.142417568925956E+000 0.000000000000000E+000 0.000000000000000E+000 0.245793080163591E+000 0.000000000000000E+000 0.000000000000000E+000 0.381580865708519E+000 0.000000000000000E+000 0.000000000000000E+000 0.572371298562780E+000 0.000000000000000E+000 0.000000000000000E+000 0.491586160327194E+000 0.000000000000000E+000 0.000000000000000E+000 0.356043922314900E+000 0.000000000000000E+000 0.000000000000000E+000 0.202576714420547E+000 0.000000000000000E+000 0.000000000000000E+000 0.601591454945867E-001 0.000000000000000E+000 0.000000000000000E+000 -0.500916966567159E-001 0.000000000000000E+000 0.000000000000000E+000 -0.114916245271291E+000 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631256E+000 0.000000000000000E+000 0.000000000000000E+000 -0.945358000629208E-001 0.000000000000000E+000 0.000000000000000E+000 -0.220992779367864E-001 0.000000000000000E+000 0.000000000000000E+000 0.702265943324567E-001 0.000000000000000E+000 0.000000000000000E+000 0.156413778285925E+000 0.000000000000000E+000 0.000000000000000E+000 0.145241365551216E+000 0.000000000000000E+000 0.000000000000000E+000 0.335172382041229E-001 0.000000000000000E+000 0.000000000000000E+000 0.368689620245394E+000 0.000000000000000E+000 0.000000000000000E+000 0.134068952816507E+000 0.000000000000000E+000 0.000000000000000E+000 0.122896540081798E+000 0.000000000000000E+000 0.000000000000000E+000 0.111724127347089E+000 0.000000000000000E+000 0.000000000000000E+000 0.100551714612380E+000 0.000000000000000E+000 0.000000000000000E+000 0.893793018776705E-001 0.000000000000000E+000 0.000000000000000E+000 0.782068891429612E-001 0.000000000000000E+000 0.000000000000000E+000 0.670344764082517E-001 0.000000000000000E+000 0.000000000000000E+000 0.558620636735422E-001 0.000000000000000E+000 0.000000000000000E+000 0.446896509388325E-001 0.000000000000000E+000 0.000000000000000E+000 0.162061371536391E-001 0.000000000000000E+000 0.000000000000000E+000 -0.552481948420237E-002 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262568E-001 0.000000000000000E+000 0.000000000000000E+000 -0.386737363893833E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904367E-001 0.000000000000000E+000 0.000000000000000E+000 -0.187843862462742E-001 0.000000000000000E+000 0.000000000000000E+000 0.257824909262462E-001 0.000000000000000E+000 0.000000000000000E+000 0.101288357210267E+000 0.000000000000000E+000 0.000000000000000E+000 0.213626353388936E+000 0.000000000000000E+000 0.000000000000000E+000 0.284835137851920E+000 0.000000000000000E+000 0.000000000000000E+000 0.168813928683788E+000 0.000000000000000E+000 0.000000000000000E+000 0.515649818525011E-001 0.000000000000000E+000 0.000000000000000E+000 -0.438302345746279E-001 0.000000000000000E+000 0.000000000000000E+000 -0.102147773574481E+000 0.000000000000000E+000 0.000000000000000E+000 -0.116021209168131E+000 0.000000000000000E+000 0.000000000000000E+000 -0.859416364208373E-001 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420542E-001 0.000000000000000E+000 0.000000000000000E+000 0.648245486145753E-001 0.000000000000000E+000 0.000000000000000E+000 0.594225028966941E-001 0.000000000000000E+000 0.000000000000000E+000 0.216081828715214E-001 0.000000000000000E+000 0.000000000000000E+000 0.135051142947030E+000 0.000000000000000E+000 0.000000000000000E+000 0.540204571788126E-001 0.000000000000000E+000 0.000000000000000E+000 0.486184114609310E-001 0.000000000000000E+000 0.000000000000000E+000 0.432163657430491E-001 0.000000000000000E+000 0.000000000000000E+000 0.378143200251673E-001 0.000000000000000E+000 0.000000000000000E+000 0.324122743072855E-001 0.000000000000000E+000 0.000000000000000E+000 0.270102285894034E-001 0.000000000000000E+000 0.000000000000000E+000 -0.736642597893314E-002 0.000000000000000E+000 0.000000000000000E+000 -0.343766545683393E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525076E-001 0.000000000000000E+000 0.000000000000000E+000 -0.510738867872443E-001 0.000000000000000E+000 0.000000000000000E+000 -0.250458483283625E-001 0.000000000000000E+000 0.000000000000000E+000 0.343766545683349E-001 0.000000000000000E+000 0.000000000000000E+000 0.429708182104167E-001 0.000000000000000E+000 0.000000000000000E+000 -0.375687724925390E-001 0.000000000000000E+000 0.000000000000000E+000 -0.893793018776710E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705006E+000 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787538E-001 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473221E-001 0.000000000000000E+000 0.000000000000000E+000 -0.165744584525904E-001 0.000000000000000E+000 0.000000000000000E+000 -0.920803247366436E-002 0.000000000000000E+000 0.000000000000000E+000 -0.313073104104510E-001 0.000000000000000E+000 0.000000000000000E+000 -0.147328519578589E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631273E-001 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683959E-001 0.000000000000000E+000 0.000000000000000E+000 -0.429708182104221E-001 0.000000000000000E+000 0.000000000000000E+000 -0.644562273156311E-001 0.000000000000000E+000 0.000000000000000E+000 -0.638423584840534E-001 0.000000000000000E+000 0.000000000000000E+000 -0.766108301808622E-001 0.000000000000000E+000 0.000000000000000E+000 -0.902387182418805E-001 0.000000000000000E+000 0.000000000000000E+000 -0.687533091366707E-001 0.000000000000000E+000 0.000000000000000E+000 -0.601591454945875E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525047E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787555E-001 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 -0.710542735760100E-014 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.187843862462688E+000 0.000000000000000E+000 0.000000000000000E+000 0.229586943009952E+000 0.000000000000000E+000 0.000000000000000E+000 0.178758603755343E+000 0.000000000000000E+000 0.000000000000000E+000 0.810306857682187E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262512E-001 0.000000000000000E+000 0.000000000000000E+000 -0.111724127347089E+000 0.000000000000000E+000 0.000000000000000E+000 -0.154694945557508E+000 0.000000000000000E+000 0.000000000000000E+000 -0.140453188664911E+000 0.000000000000000E+000 0.000000000000000E+000 -0.626146208208954E-001 0.000000000000000E+000 0.000000000000000E+000 0.773474727787531E-001 0.000000000000000E+000 0.000000000000000E+000 0.270102285894063E+000 0.000000000000000E+000 0.000000000000000E+000 0.498461491240861E+000 0.000000000000000E+000 0.000000000000000E+000 0.737379240490786E+000 0.000000000000000E+000 0.000000000000000E+000 0.953952164271302E+000 0.000000000000000E+000 0.000000000000000E+000 0.110741937216565E+001 0.000000000000000E+000 0.000000000000000E+000 0.114916245271292E+001 0.000000000000000E+000 0.000000000000000E+000 0.102270547340797E+001 0.000000000000000E+000 0.000000000000000E+000 0.663714980701494E+000 0.000000000000000E+000 0.000000000000000E+000 0.223050715522772E-014 0.000000000000000E+000 0.000000000000000E+000 -0.653218228490458E-015 0.000000000000000E+000 0.000000000000000E+000 0.737589533010945E-015 0.000000000000000E+000 0.000000000000000E+000 -0.315523780296061E-014 0.000000000000000E+000 0.000000000000000E+000 -0.316323443700870E-014 0.000000000000000E+000 0.000000000000000E+000 -0.195944113899395E-014 0.000000000000000E+000 0.000000000000000E+000 0.148471709671817E-014 0.000000000000000E+000 0.000000000000000E+000 0.353111595155754E-015 0.000000000000000E+000 0.000000000000000E+000 0.857102863693347E-015 0.000000000000000E+000 0.000000000000000E+000 0.310800995488509E-016 0.000000000000000E+000 0.000000000000000E+000 0.239375378218891E-015 0.000000000000000E+000 0.000000000000000E+000 -0.158001675580925E-017 0.000000000000000E+000 0.000000000000000E+000 -0.324110734047959E-015 0.000000000000000E+000 0.000000000000000E+000 0.104052792894251E-016 0.000000000000000E+000 0.000000000000000E+000 -0.108909271427293E-015 0.000000000000000E+000 0.000000000000000E+000 -0.126724783866043E-015 0.000000000000000E+000 0.000000000000000E+000 -0.106713817699157E-015 0.000000000000000E+000 0.000000000000000E+000 -0.411311511646058E-016 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000 0.177408092325872E+000 0.000000000000000E+000 0.000000000000000E+000 0.511352736703982E+000 0.000000000000000E+000 0.000000000000000E+000 0.104357701368160E-001 0.000000000000000E+000 0.000000000000000E+000 0.216081828715249E+000 0.000000000000000E+000 0.000000000000000E+000 0.167586191020634E+000 0.000000000000000E+000 0.000000000000000E+000 0.756286400503375E-001 0.000000000000000E+000 0.000000000000000E+000 -0.239408844315190E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705005E+000 0.000000000000000E+000 0.000000000000000E+000 -0.141803700094382E+000 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968101E+000 0.000000000000000E+000 0.000000000000000E+000 -0.563531587388058E-001 0.000000000000000E+000 0.000000000000000E+000 0.687533091366693E-001 0.000000000000000E+000 0.000000000000000E+000 0.236339500157305E+000 0.000000000000000E+000 0.000000000000000E+000 0.427252706777881E+000 0.000000000000000E+000 0.000000000000000E+000 0.614482700408988E+000 0.000000000000000E+000 0.000000000000000E+000 0.763161731417034E+000 0.000000000000000E+000 0.000000000000000E+000 0.830564529124237E+000 0.000000000000000E+000 0.000000000000000E+000 0.766108301808612E+000 0.000000000000000E+000 0.000000000000000E+000 0.383054150904306E+000 0.000000000000000E+000 0.000000000000000E+000 0.276854843041411E+000 0.000000000000000E+000 0.000000000000000E+000 0.190790432854261E+000 0.000000000000000E+000 0.000000000000000E+000 0.122896540081797E+000 0.000000000000000E+000 0.000000000000000E+000 0.712087844629814E-001 0.000000000000000E+000 0.000000000000000E+000 0.337627857367586E-001 0.000000000000000E+000 0.000000000000000E+000 0.859416364208299E-002 0.000000000000000E+000 0.000000000000000E+000 -0.626146208208957E-002 0.000000000000000E+000 0.000000000000000E+000 -0.127684716968098E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631259E-001 0.000000000000000E+000 0.000000000000000E+000 -0.859416364208375E-002 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473222E-002 0.000000000000000E+000 0.000000000000000E+000 0.540204571788124E-002 0.000000000000000E+000 0.000000000000000E+000 0.111724127347087E-001 0.000000000000000E+000 0.000000000000000E+000 0.135051142947031E-001 0.000000000000000E+000 0.000000000000000E+000 0.208715402736320E-001 0.000000000000000E+000 0.000000000000000E+000 0.313073104104480E-001 0.000000000000000E+000 0.000000000000000E+000 0.417430805472640E-001 0.000000000000000E+000 0.000000000000000E+000 0.521788506840800E-001 0.000000000000000E+000 0.000000000000000E+000 0.626146208208960E-001 0.000000000000000E+000 0.000000000000000E+000 0.730503909577120E-001 0.000000000000000E+000 0.000000000000000E+000 0.834861610945281E-001 0.000000000000000E+000 0.000000000000000E+000 0.939219312313441E-001 0.000000000000000E+000 0.000000000000000E+000 0.104357701368160E+000 0.000000000000000E+000 0.000000000000000E+000 0.114793471504976E+000 0.000000000000000E+000 0.000000000000000E+000 0.125229241641792E+000 0.000000000000000E+000 0.000000000000000E+000 0.135665011778608E+000 0.000000000000000E+000 0.000000000000000E+000 0.146100781915424E+000 0.000000000000000E+000 0.000000000000000E+000 0.156536552052240E+000 0.000000000000000E+000 0.000000000000000E+000 0.166972322189056E+000 0.000000000000000E+000 0.000000000000000E+000 0.202576714420546E+000 0.000000000000000E+000 0.000000000000000E+000 0.553709686082823E+000 0.000000000000000E+000 0.000000000000000E+000 0.270102285894061E-001 0.000000000000000E+000 0.000000000000000E+000 0.156413778285925E+000 0.000000000000000E+000 0.000000000000000E+000 0.702265943324562E-001 0.000000000000000E+000 0.000000000000000E+000 -0.220992779367867E-001 0.000000000000000E+000 0.000000000000000E+000 -0.945358000629212E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631257E+000 0.000000000000000E+000 0.000000000000000E+000 -0.114916245271292E+000 0.000000000000000E+000 0.000000000000000E+000 -0.500916966567167E-001 0.000000000000000E+000 0.000000000000000E+000 0.601591454945878E-001 0.000000000000000E+000 0.000000000000000E+000 0.202576714420547E+000 0.000000000000000E+000 0.000000000000000E+000 0.356043922314902E+000 0.000000000000000E+000 0.000000000000000E+000 0.491586160327190E+000 0.000000000000000E+000 0.000000000000000E+000 0.572371298562777E+000 0.000000000000000E+000 0.000000000000000E+000 0.381580865708522E+000 0.000000000000000E+000 0.000000000000000E+000 0.245793080163594E+000 0.000000000000000E+000 0.000000000000000E+000 0.142417568925961E+000 0.000000000000000E+000 0.000000000000000E+000 0.675255714735166E-001 0.000000000000000E+000 0.000000000000000E+000 0.171883272841666E-001 0.000000000000000E+000 0.000000000000000E+000 -0.125229241641787E-001 0.000000000000000E+000 0.000000000000000E+000 -0.255369433936204E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262515E-001 0.000000000000000E+000 0.000000000000000E+000 -0.171883272841673E-001 0.000000000000000E+000 0.000000000000000E+000 -0.368321298946463E-002 0.000000000000000E+000 0.000000000000000E+000 0.108040914357625E-001 0.000000000000000E+000 0.000000000000000E+000 0.223448254694179E-001 0.000000000000000E+000 0.000000000000000E+000 0.405153428841092E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788123E-001 0.000000000000000E+000 0.000000000000000E+000 0.675255714735154E-001 0.000000000000000E+000 0.000000000000000E+000 0.810306857682185E-001 0.000000000000000E+000 0.000000000000000E+000 0.945358000629216E-001 0.000000000000000E+000 0.000000000000000E+000 0.108040914357625E+000 0.000000000000000E+000 0.000000000000000E+000 0.121546028652328E+000 0.000000000000000E+000 0.000000000000000E+000 0.135051142947031E+000 0.000000000000000E+000 0.000000000000000E+000 0.148556257241734E+000 0.000000000000000E+000 0.000000000000000E+000 0.162061371536437E+000 0.000000000000000E+000 0.000000000000000E+000 0.175566485831140E+000 0.000000000000000E+000 0.000000000000000E+000 0.189071600125843E+000 0.000000000000000E+000 0.000000000000000E+000 0.145241365551216E+000 0.000000000000000E+000 0.000000000000000E+000 0.368689620245392E+000 0.000000000000000E+000 0.000000000000000E+000 0.335172382041267E-001 0.000000000000000E+000 0.000000000000000E+000 0.648245486145750E-001 0.000000000000000E+000 0.000000000000000E+000 -0.202576714420545E-001 0.000000000000000E+000 0.000000000000000E+000 -0.859416364208375E-001 0.000000000000000E+000 0.000000000000000E+000 -0.116021209168131E+000 0.000000000000000E+000 0.000000000000000E+000 -0.102147773574482E+000 0.000000000000000E+000 0.000000000000000E+000 -0.438302345746269E-001 0.000000000000000E+000 0.000000000000000E+000 0.515649818525040E-001 0.000000000000000E+000 0.000000000000000E+000 0.168813928683790E+000 0.000000000000000E+000 0.000000000000000E+000 0.284835137851922E+000 0.000000000000000E+000 0.000000000000000E+000 0.213626353388941E+000 0.000000000000000E+000 0.000000000000000E+000 0.101288357210274E+000 0.000000000000000E+000 0.000000000000000E+000 0.257824909262503E-001 0.000000000000000E+000 0.000000000000000E+000 -0.187843862462682E-001 0.000000000000000E+000 0.000000000000000E+000 -0.383054150904304E-001 0.000000000000000E+000 0.000000000000000E+000 -0.386737363893777E-001 0.000000000000000E+000 0.000000000000000E+000 -0.257824909262514E-001 0.000000000000000E+000 0.000000000000000E+000 -0.552481948419693E-002 0.000000000000000E+000 0.000000000000000E+000 0.162061371536437E-001 0.000000000000000E+000 0.000000000000000E+000 0.446896509388357E-001 0.000000000000000E+000 0.000000000000000E+000 0.558620636735446E-001 0.000000000000000E+000 0.000000000000000E+000 0.670344764082535E-001 0.000000000000000E+000 0.000000000000000E+000 0.782068891429624E-001 0.000000000000000E+000 0.000000000000000E+000 0.893793018776713E-001 0.000000000000000E+000 0.000000000000000E+000 0.100551714612380E+000 0.000000000000000E+000 0.000000000000000E+000 0.111724127347089E+000 0.000000000000000E+000 0.000000000000000E+000 0.122896540081798E+000 0.000000000000000E+000 0.000000000000000E+000 0.134068952816507E+000 0.000000000000000E+000 0.000000000000000E+000 0.594225028966937E-001 0.000000000000000E+000 0.000000000000000E+000 0.135051142947031E+000 0.000000000000000E+000 0.000000000000000E+000 0.216081828715250E-001 0.000000000000000E+000 0.000000000000000E+000 -0.184160649473223E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787536E-001 0.000000000000000E+000 0.000000000000000E+000 -0.103129963705006E+000 0.000000000000000E+000 0.000000000000000E+000 -0.893793018776709E-001 0.000000000000000E+000 0.000000000000000E+000 -0.375687724925381E-001 0.000000000000000E+000 0.000000000000000E+000 0.429708182104174E-001 0.000000000000000E+000 0.000000000000000E+000 0.343766545683340E-001 0.000000000000000E+000 0.000000000000000E+000 -0.250458483283588E-001 0.000000000000000E+000 0.000000000000000E+000 -0.510738867872405E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525033E-001 0.000000000000000E+000 0.000000000000000E+000 -0.343766545683348E-001 0.000000000000000E+000 0.000000000000000E+000 -0.736642597892886E-002 0.000000000000000E+000 0.000000000000000E+000 0.270102285894063E-001 0.000000000000000E+000 0.000000000000000E+000 0.324122743072874E-001 0.000000000000000E+000 0.000000000000000E+000 0.378143200251687E-001 0.000000000000000E+000 0.000000000000000E+000 0.432163657430500E-001 0.000000000000000E+000 0.000000000000000E+000 0.486184114609312E-001 0.000000000000000E+000 0.000000000000000E+000 0.540204571788125E-001 0.000000000000000E+000 0.000000000000000E+000 -0.165744584525901E-001 0.000000000000000E+000 0.000000000000000E+000 -0.313073104104475E-001 0.000000000000000E+000 0.000000000000000E+000 -0.920803247366124E-002 0.000000000000000E+000 0.000000000000000E+000 -0.687533091366698E-001 0.000000000000000E+000 0.000000000000000E+000 -0.902387182418796E-001 0.000000000000000E+000 0.000000000000000E+000 -0.766108301808606E-001 0.000000000000000E+000 0.000000000000000E+000 -0.638423584840506E-001 0.000000000000000E+000 0.000000000000000E+000 -0.644562273156281E-001 0.000000000000000E+000 0.000000000000000E+000 -0.429708182104186E-001 0.000000000000000E+000 0.000000000000000E+000 -0.110496389683934E-001 0.000000000000000E+000 0.000000000000000E+000 -0.128912454631257E-001 0.000000000000000E+000 0.000000000000000E+000 -0.147328519578579E-001 0.000000000000000E+000 0.000000000000000E+000 -0.601591454945860E-001 0.000000000000000E+000 0.000000000000000E+000 -0.773474727787537E-001 0.000000000000000E+000 0.000000000000000E+000 -0.515649818525023E-001 + + + + + + + + + + diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetFacetDOFValueFromQuadrature_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetFacetDOFValueFromQuadrature_test_1.F90 new file mode 100644 index 00000000..a4d5b44b --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetFacetDOFValueFromQuadrature_test_1.F90 @@ -0,0 +1,268 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +PURE ELEMENTAL FUNCTION func1(x, y) RESULT(ans) + REAL(DFP), INTENT(IN) :: x, y + REAL(DFP) :: ans + ans = 1.0_DFP + ans = x**2 + y**2 + ! ans = y + y**2 + y**3 +END FUNCTION func1 + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 3), tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 3), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50), massMat(10, 10) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: iface = 1 + INTEGER(I4B), PARAMETER :: nptrs(5) = [1, 2, 4, 5, 6] + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + + CALL Display("test1: elemsd%order=4") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 1 + + feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + faceOrient=faceOrient, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2 * order) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:3), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize, massMat=massMat, ipiv=ipiv) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 3), tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 3), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50), massMat(10, 10) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: order = 4 + INTEGER(I4B), PARAMETER :: iface = 2 + INTEGER(I4B), PARAMETER :: nptrs(5) = [2, 3, 7, 8, 9] + + CALL Display("test2: elemsd%order=4") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 1 + + feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + faceOrient=faceOrient, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2 * order) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:3), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize, massMat=massMat, ipiv=ipiv) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 3), tsize, ipiv(10) + REAL(DFP) :: refElemCoord(3, 3), interpolCoord(3, 50), funcVal(50), & + ans(50), exactAns(50), massMat(10, 10) + TYPE(QuadraturePoint_) :: quad, facetQuad + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + INTEGER(I4B), PARAMETER :: order = 4 + LOGICAL(LGT) :: isok + INTEGER(I4B), PARAMETER :: iface = 3 + INTEGER(I4B), PARAMETER :: nptrs(5) = [3, 1, 10, 11, 12] + + CALL Display("test3: elemsd%order=4") + + faceOrient(1, 1) = +1 ! 1 --> 2 + faceOrient(1, 2) = +1 ! 2 --> 3 + faceOrient(1, 3) = -1 ! 3 --> 1 + + feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + faceOrient=faceOrient, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2 * order) + + ! Getting quadrature for interpolation points + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + ! Getting interpolation points + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:3), ans=interpolCoord, nrow=nrow, ncol=ncol, & + order=[order], ipType=[TypeInterpolationOpt%equidistance]) + + exactAns(1:SIZE(nptrs)) = func1(x=interpolCoord(1, nptrs), & + y=interpolCoord(2, nptrs)) + + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetElemsd=geoFacetElemsd, & + facetQuad=facetQuad, localFaceNumber=iface) + + CALL feptr%SetOrder(order=order) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetElemsd=facetElemsd, facetQuad=facetQuad, & + localFaceNumber=iface) + + CALL feptr%GetGlobalFacetElemShapeData( & + elemsd=elemsd, facetElemsd=facetElemsd, localFaceNumber=iface, & + geoElemsd=geoElemsd, geoFacetElemsd=geoFacetElemsd, xij=refElemCoord) + + funcVal(1:elemsd%nips) = func1(x=elemsd%coord(1, 1:elemsd%nips), & + y=elemsd%coord(2, 1:elemsd%nips)) + + ! obj, elemsd, facetElemsd, xij, localFaceNumber, func, ans, tsize + CALL feptr%GetFacetDOFValueFromQuadrature( & + elemsd=elemsd, facetElemsd=facetElemsd, & + xij=refElemCoord, localFaceNumber=iface, func=funcVal, & + ans=ans, tsize=tsize, massMat=massMat, ipiv=ipiv) + + isok = ALL(ans(1:tsize) .APPROXEQ.exactAns(1:tsize)) + CALL OK(isok, "test-1:") + + IF (.NOT. isok) THEN + CALL Display(ans(1:tsize), "ans: ", full=.TRUE.) + CALL Display(exactAns(1:tsize), "exactAns: ", full=.TRUE.) + END IF +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..f28d2d32 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetFacetQuadraturePoints_test_1.F90 @@ -0,0 +1,80 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE Display_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + TYPE(QuadraturePoint_) :: quad, facetQuad + + CALL Display("test1: ") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "quad : ") + CALL Display(facetQuad, "facetQuad : ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + TYPE(QuadraturePoint_) :: quad, facetQuad + + CALL Display("test2: ") + ! Changing the order of quadrature points + CALL feptr%SetQuadratureOrder(order=[4_I4B]) + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "quad : ") + CALL Display(facetQuad, "facetQuad : ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + TYPE(QuadraturePoint_) :: quad, facetQuad + + CALL Display("test3: ") + ! Changing the order of quadrature points + CALL feptr%SetQuadratureType( & + quadratureType=[TypeQuadratureOpt%GaussLegendreLobatto]) + CALL feptr%SetQuadratureOrder(order=[2_I4B]) + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL Display(quad, "quad : ") + CALL Display(facetQuad, "facetQuad : ") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 new file mode 100644 index 00000000..53da3368 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetGlobalElemShapeData_test_1.F90 @@ -0,0 +1,99 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr1 => NULL(), feptr2 => NULL() +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: elemsd, geoelemsd +REAL(DFP) :: refElemCoord(3, 8) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr1 => TriangleH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol + + CALL Display("test1: elemsd%order=4 : cellorient=1") + CALL feptr1%GetQuadraturePoints(quad=quad) + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr1%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd%N, "elemsd%N: ") + CALL Display(SUM(elemsd%N), "sum elemsd%N: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 3) + + CALL Display("test2: elemsd%order=4 : cellorient=-1") + + faceOrient(1, 1) = -1 + faceOrient(1, 2) = 1 + faceOrient(1, 3) = -1 + + feptr2 => TriangleH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + faceOrient=faceOrient, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + + ! CALL feptr2%Display("feptr2: ") + CALL feptr2%GetQuadraturePoints(quad=quad) + CALL feptr2%SetOrder(order=1) + CALL feptr2%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr2%SetOrder(order=4) + CALL feptr2%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL feptr2%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + CALL feptr2%GetGlobalElemShapeData(xij=refElemCoord, elemsd=elemsd, & + geoelemsd=geoelemsd) + + CALL Display(elemsd%N, "elemsd%N: ") + CALL Display(SUM(elemsd%N), "SUM(elemsd%N): ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetGlobalElemShapeData_test_2.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetGlobalElemShapeData_test_2.F90 new file mode 100644 index 00000000..1eeca3f5 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetGlobalElemShapeData_test_2.F90 @@ -0,0 +1,186 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Generating shape functions on collection of triangle elements +! +! (4) ---------- (3) +! | / | +! | / | +! | / | +! | / | +! | / | +! (1) ---------- (2) +! +! 4th order Lagrange element on linear mesh +! +! (4) ---------- (3) +! | / | +! | / | +! | / | +! | / | +! | / | +! (1) ---------- (2) + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE VTKPlot_Class +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr1 => NULL(), feptr2 => NULL() +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: elemsd1, geoelemsd, elemsd2 +TYPE(VTKPlot_) :: plot +REAL(DFP) :: refElemCoord(3, 8), xij(3, 500), elemCoord(3, 8) +REAL(DFP), ALLOCATABLE :: plotData(:, :) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 + +CALL Reallocate(plotData, elemsd1%nips + elemsd2%nips, 5) + +plotData(1:elemsd1%nips, 1) = elemsd1%coord(1, 1:elemsd1%nips) +plotData(1:elemsd1%nips, 2) = elemsd1%coord(2, 1:elemsd1%nips) +plotData(1:elemsd1%nips, 3) = elemsd1%N(10, 1:elemsd1%nips) +plotData(1:elemsd1%nips, 4) = elemsd1%N(11, 1:elemsd1%nips) +plotData(1:elemsd1%nips, 5) = elemsd1%N(12, 1:elemsd1%nips) + +plotData(1 + elemsd1%nips:elemsd1%nips + elemsd2%nips, 1) = & + elemsd2%coord(1, 1:elemsd2%nips) +plotData(1 + elemsd1%nips:elemsd1%nips + elemsd2%nips, 2) = & + elemsd2%coord(2, 1:elemsd2%nips) +plotData(1 + elemsd1%nips:elemsd1%nips + elemsd2%nips, 3) = & + elemsd2%N(4, 1:elemsd2%nips) +plotData(1 + elemsd1%nips:elemsd1%nips + elemsd2%nips, 4) = & + elemsd2%N(5, 1:elemsd2%nips) +plotData(1 + elemsd1%nips:elemsd1%nips + elemsd2%nips, 5) = & + elemsd2%N(6, 1:elemsd2%nips) + +CALL plot%Initiate() +CALL plot%Scatter3D(x=plotData(:, 1), & + y=plotData(:, 2), & + z=plotData(:, 3), label="N11", & + filename="Order4_N11.vtp") + +CALL plot%Scatter3D(x=plotData(:, 1), & + y=plotData(:, 2), & + z=plotData(:, 4), label="N12", & + filename="Order4_N12.vtp") + +CALL plot%Scatter3D(x=plotData(:, 1), & + y=plotData(:, 2), & + z=plotData(:, 5), label="N13", & + filename="Order4_N13.vtp") +CALL plot%DEALLOCATE() + + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 3) + + CALL Display("test1: element 1") + CALL Display([1, 2, 3], "Global node numbers: ") + faceOrient = 0 + faceOrient(1, 1) = 1 + faceOrient(1, 2) = 1 + faceOrient(1, 3) = -1 + CALL Display(faceOrient(1, 1:3), "faceOrient: ") + + feptr1 => TriangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + faceOrient=faceOrient, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=1) + + CALL feptr1%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr1%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:3), ans=xij, nrow=nrow, ncol=ncol, & + order=[19], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr1%SetOrder(order=1) + CALL feptr1%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr1%SetOrder(order=4) + CALL feptr1%GetLocalElemShapeData(elemsd=elemsd1, quad=quad) + + elemCoord = 0.0_DFP + elemCoord(1:2, 1) = [0.0_DFP, 0.0_DFP] + elemCoord(1:2, 2) = [1.0_DFP, 0.0_DFP] + elemCoord(1:2, 3) = [1.0_DFP, 1.0_DFP] + + CALL feptr1%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:3), & + elemsd=elemsd1, geoelemsd=geoelemsd) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: nrow, ncol, faceOrient(3, 3) + + CALL Display("test2: element 2") + CALL Display([1, 3, 4], "Global node numbers: ") + faceOrient = 0 + faceOrient(1, 1) = 1 + faceOrient(1, 2) = 1 + faceOrient(1, 3) = -1 + CALL Display(faceOrient(1, 1:3), "faceOrient: ") + + feptr2 => TriangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + faceOrient=faceOrient, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=1) + + CALL feptr2%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr2%GetInterpolationPoints( & + xij=refElemCoord(1:2, 1:3), ans=xij, nrow=nrow, ncol=ncol, & + order=[19], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Initiate(quad, xij(1:3, 1:ncol)) + ! CALL Display(quad, "quad points: ") + + CALL feptr2%SetOrder(order=1) + CALL feptr2%GetLocalElemShapeData(elemsd=geoelemsd, quad=quad) + + CALL feptr2%SetOrder(order=4) + CALL feptr2%GetLocalElemShapeData(elemsd=elemsd2, quad=quad) + + elemCoord = 0.0_DFP + elemCoord(1:2, 1) = [0.0_DFP, 0.0_DFP] + elemCoord(1:2, 2) = [1.0_DFP, 1.0_DFP] + elemCoord(1:2, 3) = [0.0_DFP, 1.0_DFP] + + CALL feptr2%GetGlobalElemShapeData(xij=elemCoord(1:2, 1:3), & + elemsd=elemsd2, geoelemsd=geoelemsd) +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetInterpolationPoints_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetInterpolationPoints_test_1.F90 new file mode 100644 index 00000000..bbca50ca --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetInterpolationPoints_test_1.F90 @@ -0,0 +1,122 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing TriangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +REAL(DFP) :: refElemCoord(3, 8), xij(3, 100) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test1: order=1, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[1], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test2: order=2, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[2], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test3: order=3, ipType=Equidistance") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + ! obj, xij, ans, nrow, ncol, order, ipType, alpha, beta, lambda) + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%Equidistance]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + ! Get the default interpolation points + INTEGER(I4B) :: nsd, nns, nrow, ncol + + CALL Display("test4: order=3, ipType=GaussLegendreLobatto") + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nsd, ncol=nns) + + CALL feptr%GetInterpolationPoints( & + xij=refElemCoord(1:nsd, 1:nns), ans=xij, nrow=nrow, ncol=ncol, & + order=[3], ipType=[TypeInterpolationOpt%GaussLegendreLobatto]) + + CALL Display(xij(1:nrow, 1:ncol), & + "Interpolation points: ") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 new file mode 100644 index 00000000..5661e053 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetLocalElemShapeData_test_1.F90 @@ -0,0 +1,63 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing TriangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + TYPE(ElemShapeData_) :: elemsd + TYPE(QuadraturePoint_) :: quad + + CALL Display("test1") + CALL feptr%GetQuadraturePoints(quad=quad) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + TYPE(ElemShapeData_) :: elemsd + TYPE(QuadraturePoint_) :: quad + + ! Lets change the order of element shape data + CALL Display("test2") + CALL feptr%SetOrder(order=2) + CALL feptr%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetLocalFacetElemShapeData_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetLocalFacetElemShapeData_test_1.F90 new file mode 100644 index 00000000..08eb8dc9 --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetLocalFacetElemShapeData_test_1.F90 @@ -0,0 +1,120 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing TriangleH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_ + +USE Display_Method + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=2, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + TYPE(ElemShapeData_) :: elemsd, facetElemsd + TYPE(QuadraturePoint_) :: quad, facetQuad + + CALL Display("test1") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetQuad=facetQuad, facetElemsd=facetElemsd, & + localFaceNumber=1) + + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ") + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + TYPE(ElemShapeData_) :: elemsd, facetElemsd + TYPE(QuadraturePoint_) :: quad, facetQuad + + CALL Display("test2") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + + CALL feptr%SetOrder(order=2) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetQuad=facetQuad, facetElemsd=facetElemsd, & + localFaceNumber=1) + + CALL Display(facetElemsd%N(1:facetElemsd%nns, 1:facetElemsd%nips), & + "facetElemsd%N: ") + + CALL Display(elemsd%N(1:elemsd%nns, 1:elemsd%nips), "elemsd%N: ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + TYPE(ElemShapeData_) :: elemsd, geoElemsd, facetElemsd, geoFacetElemsd + TYPE(QuadraturePoint_) :: quad, facetQuad + REAL(DFP) :: refElemCoord(3, 3) + INTEGER(I4B) :: nrow, ncol + + CALL Display("test3") + CALL feptr%GetFacetQuadraturePoints(quad=quad, facetQuad=facetQuad, & + localFaceNumber=1) + + CALL feptr%SetOrder(order=1) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=geoElemsd, quad=quad, facetQuad=facetQuad, & + facetElemsd=geoFacetElemsd, localFaceNumber=1) + + CALL feptr%GetRefElemCoord(ans=refElemCoord, nrow=nrow, ncol=ncol) + + CALL feptr%SetOrder(order=2) + + CALL feptr%GetLocalFacetElemShapeData( & + elemsd=elemsd, quad=quad, facetQuad=facetQuad, facetElemsd=facetElemsd, & + localFaceNumber=1) + + CALL feptr%GetGlobalElemShapeData(elemsd=elemsd, xij=refElemCoord, & + geoElemsd=geoElemsd) + + CALL Display(elemsd, "elemsd: ") + + CALL feptr%GetGlobalElemShapeData( & + elemsd=facetElemsd, xij=refElemCoord(1:2, 1:2), geoElemsd=geoFacetElemsd) + + CALL Display(facetElemsd, "facetElemsd: ") + +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetQuadraturePoints_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..a1741dcc --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_GetQuadraturePoints_test_1.F90 @@ -0,0 +1,46 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE QuadraturePoint_Method +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_ + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() +TYPE(QuadraturePoint_) :: quad + +feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=2 : ") + +! Changing the order of quadrature points +CALL feptr%SetQuadratureOrder(order=[4_I4B]) +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=4 : ") + +! Changing the order of quadrature points +CALL feptr%SetQuadratureOrder(order1=6_I4B) +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=6 : ") + +! Changing the quadrature type +CALL feptr%SetQuadratureType(quadratureType= & + [TypeQuadratureOpt%GaussLegendreLobatto]) +CALL feptr%SetQuadratureOrder(order1=2_I4B) +CALL feptr%GetQuadraturePoints(quad=quad) +CALL Display(quad, "Quadrature points order=2 : ") + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_TriangleH1LagrangeFEPointer_test_1.F90 b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_TriangleH1LagrangeFEPointer_test_1.F90 new file mode 100644 index 00000000..ddf27a7d --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/_TriangleH1LagrangeFEPointer_test_1.F90 @@ -0,0 +1,24 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-10 +! summary: Testing LineH1LagrangeFEPointer + +PROGRAM main +USE GlobalData, ONLY: DFP, I4B, LGT +USE AbstractFE_Class +USE TriangleH1LagrangeFE_Class +USE BaseType, ONLY: TypeInterpolationOpt, TypePolynomialOpt, & + TypeQuadratureOpt + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: feptr => NULL() + +feptr => TriangleH1LagrangeFEPointer( & + order=1, nsd=1, ipType=TypeInterpolationOpt%equidistance, & + basisType=TypePolynomialOpt%monomial, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + quadratureOrder=2) + +CALL feptr%Display("TriangleH1LagrangeFE: ") + +END PROGRAM main diff --git a/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/runner.toml b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/runner.toml new file mode 100644 index 00000000..6ebd368f --- /dev/null +++ b/docs/docs-api/H1FE/examples/TriangleH1LagrangeFE/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/H1FE/TriangleH1LagrangeFE" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/InputUtility/examples/_Input_test_1.F90 b/docs/docs-api/InputUtility/examples/_Input_test_1.F90 new file mode 100644 index 00000000..930dbbc7 --- /dev/null +++ b/docs/docs-api/InputUtility/examples/_Input_test_1.F90 @@ -0,0 +1,25 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing input utility for reading a mesh file + +PROGRAM main +USE InputUtility +USE GlobalData +USE Test_Method + +CALL test1 + +CONTAINS + +SUBROUTINE test1 + + LOGICAL(LGT) :: isok, aval + + aval = .TRUE. + isok = Input(default=.TRUE., option=aval) + + CALL OK(isok, "InputUtility") + +END SUBROUTINE test1 + +END PROGRAM main diff --git a/docs/docs-api/InputUtility/examples/runner.toml b/docs/docs-api/InputUtility/examples/runner.toml new file mode 100644 index 00000000..9d176154 --- /dev/null +++ b/docs/docs-api/InputUtility/examples/runner.toml @@ -0,0 +1,3 @@ +BuildDir = "/tmp/easifem-tests/InputUtility" +Buildtype = "Debug" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/LIS/examples/extra-examples/easifem b/docs/docs-api/LIS/examples/extra-examples/easifem new file mode 100644 index 00000000..912825c7 --- /dev/null +++ b/docs/docs-api/LIS/examples/extra-examples/easifem @@ -0,0 +1,44 @@ +#!/bin/bash +FC="gfortran" +CC="gcc" +AR="ar" +WRC= +PRJTK= +RM="rm -f" + +IDIR="-I${HOME}/include -I${HOME}/include/extpkgs" + +LDIR="-L${HOME}/lib -L${HOME}/lib/extpkgs" +# LDIR= +# warning - directory error: ../../../RR + +file=$1 + +OPTFLAGS="-g" + +SPECIALFLAGS=${IDIR} + +RCFLAGS="-O coff" + +PRJ_FFLAGS="-cpp" + +PRJ_CFLAGS= + +# PRJ_LFLAGS="-leasifem -lbefore64 -lfortranvtk -lfoxy -lpenf -lstringifor -lsparsekit -lfuncfortran -lblas -llapack" +PRJ_LFLAGS="-leasifem -lextpkgs -lblas -llapack -llis" + +FFLAGS="${SPECIALFLAGS} ${OPTFLAGS} ${PRJ_FFLAGS}" + +CFLAGS="${SPECIALFLAGS} ${OPTFLAGS} ${PRJ_CFLAGS}" + +echo "Cleaning *.o *.out" +rm *.o *.out + +echo "Compiling ${file}.F90" +${FC} -c -o ${file}.o ${FFLAGS} ${file}.F90 + +echo "building main.out" +${FC} -o main.out ${file}.o ${LDIR} ${PRJ_LFLAGS} + +echo "executing main.out" +./main.out diff --git a/docs/docs-api/LIS/examples/extra-examples/make.sh b/docs/docs-api/LIS/examples/extra-examples/make.sh new file mode 100644 index 00000000..912825c7 --- /dev/null +++ b/docs/docs-api/LIS/examples/extra-examples/make.sh @@ -0,0 +1,44 @@ +#!/bin/bash +FC="gfortran" +CC="gcc" +AR="ar" +WRC= +PRJTK= +RM="rm -f" + +IDIR="-I${HOME}/include -I${HOME}/include/extpkgs" + +LDIR="-L${HOME}/lib -L${HOME}/lib/extpkgs" +# LDIR= +# warning - directory error: ../../../RR + +file=$1 + +OPTFLAGS="-g" + +SPECIALFLAGS=${IDIR} + +RCFLAGS="-O coff" + +PRJ_FFLAGS="-cpp" + +PRJ_CFLAGS= + +# PRJ_LFLAGS="-leasifem -lbefore64 -lfortranvtk -lfoxy -lpenf -lstringifor -lsparsekit -lfuncfortran -lblas -llapack" +PRJ_LFLAGS="-leasifem -lextpkgs -lblas -llapack -llis" + +FFLAGS="${SPECIALFLAGS} ${OPTFLAGS} ${PRJ_FFLAGS}" + +CFLAGS="${SPECIALFLAGS} ${OPTFLAGS} ${PRJ_CFLAGS}" + +echo "Cleaning *.o *.out" +rm *.o *.out + +echo "Compiling ${file}.F90" +${FC} -c -o ${file}.o ${FFLAGS} ${file}.F90 + +echo "building main.out" +${FC} -o main.out ${file}.o ${LDIR} ${PRJ_LFLAGS} + +echo "executing main.out" +./main.out diff --git a/docs/docs-api/LIS/examples/extra-examples/test-1.F90 b/docs/docs-api/LIS/examples/extra-examples/test-1.F90 new file mode 100644 index 00000000..5dc7edee --- /dev/null +++ b/docs/docs-api/LIS/examples/extra-examples/test-1.F90 @@ -0,0 +1,67 @@ +PROGRAM main +USE easifemBase +IMPLICIT NONE + +TYPE(sparsematrix_) :: tanmat +REAL(dfp), ALLOCATABLE :: mat(:, :) + +TYPE(lis_) :: obj +INTEGER(I4B) :: maxiter +REAL(DFP) :: tol + +!<--- make tanmat +! make csr matrix +CALL display('flag1') +CALL initiate(obj=tanmat, tdof=1, tnodes=[10]) +CALL setsparsity(obj=tanmat, row=1, col=[1, 2]) +CALL setsparsity(obj=tanmat, row=2, col=[1, 2, 3]) +CALL setsparsity(obj=tanmat, row=3, col=[2, 3, 4]) +CALL setsparsity(obj=tanmat, row=4, col=[3, 4, 5]) +CALL setsparsity(obj=tanmat, row=5, col=[4, 5, 6]) +CALL setsparsity(obj=tanmat, row=6, col=[5, 6, 7]) +CALL setsparsity(obj=tanmat, row=7, col=[6, 7, 8]) +CALL setsparsity(obj=tanmat, row=8, col=[7, 8, 9]) +CALL setsparsity(obj=tanmat, row=9, col=[8, 9, 10]) +CALL setsparsity(obj=tanmat, row=10, col=[9, 10]) +CALL display('flag2') +CALL setsparsity(tanmat) +CALL display('flag3') +ALLOCATE (mat(2, 2)) +mat = RESHAPE([1, -1, -1, 1], [2, 2]) +CALL addcontribution(tanmat, [1, 2], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [2, 3], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [3, 4], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [4, 5], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [5, 6], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [6, 7], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [7, 8], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [8, 9], mat, 1.0_DFP, NONE) +CALL addcontribution(tanmat, [9, 10], mat, 1.0_DFP, NONE) +CALL display('flag4') +CALL convert(from=tanmat, to=mat) +CALL display('flag5') +CALL display(mat, 'mat') +CALL display('flag6') +!<--- +tol = 1.0E-5 +maxiter = 10 + +CALL initiate( & + & obj=obj, & + & Solvername=lis_cg, & + & Maxiter=maxiter, & + & Tol=tol) + +CALL display('flag7') + +CALL setPrecondition( & + & obj=obj, & + & precondType=p_none) + +CALL display('flag8') + +CALL setsparsity(From=tanmat, To=obj) + +CALL display('flag9') + +END PROGRAM main diff --git a/docs/docs-api/LIS/examples/extra-examples/test-2.F90 b/docs/docs-api/LIS/examples/extra-examples/test-2.F90 new file mode 100644 index 00000000..5e16ca5f --- /dev/null +++ b/docs/docs-api/LIS/examples/extra-examples/test-2.F90 @@ -0,0 +1,70 @@ +!<--- test of set dirichlet boundary nodes +program main +use easifem +implicit none + +type( sparsematrix_ ) :: tanmat +real( dfp ), allocatable :: mat( :, : ) + +type( lis_ ) :: obj +INTEGER( I4B ) :: maxiter +REAL( DFP ) :: tol + +!<--- make tanmat +! make csr matrix +call display( 'flag1' ) +call initiate( obj = tanmat, tdof = 1, tnodes = [10] ) +call setsparsity( obj = tanmat, row = 1, col = [1,2] ) +call setsparsity( obj = tanmat, row = 2, col = [1,2,3] ) +call setsparsity( obj = tanmat, row = 3, col = [2,3,4] ) +call setsparsity( obj = tanmat, row = 4, col = [3,4,5] ) +call setsparsity( obj = tanmat, row = 5, col = [4,5,6] ) +call setsparsity( obj = tanmat, row = 6, col = [5,6,7] ) +call setsparsity( obj = tanmat, row = 7, col = [6,7,8] ) +call setsparsity( obj = tanmat, row = 8, col = [7,8,9] ) +call setsparsity( obj = tanmat, row = 9, col = [8,9,10] ) +call setsparsity( obj = tanmat, row = 10, col = [9,10] ) +call display( 'flag2' ) +call setsparsity( tanmat ) +call display( 'flag3' ) +allocate( mat( 2, 2 ) ) +mat = reshape( [1,-1,-1,1], [2,2]) +call addcontribution( tanmat, [1,2], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [2,3], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [3,4], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [4,5], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [5,6], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [6,7], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [7,8], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [8,9], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [9,10], mat, 1.0_dfp, NONE) +call display( 'flag4' ) +call convert( from = tanmat, to = mat ) +call display( 'flag5' ) +call display( mat, 'mat' ) +call display( 'flag6' ) +!<--- +tol = 1.0e-5 +maxiter = 10 + +call initiate( & + & obj = obj, & + & Solvername = lis_cg, & + & Maxiter = maxiter, & + & Tol = tol ) + +call display( 'flag7' ) + +call setPrecondition( & + & obj = obj, & + & precondType = p_none ) +call display( 'flag8' ) +call setsparsity( From = tanmat, To = obj ) +call display( 'flag9' ) + +call setDirichletBCNodes( obj = obj, Nptrs = [1,10], dofs=[1] ) +call display( obj % dbcNptrs, 'dbcNptrs') +call display( obj % dbcIA, 'dbcIA') +call display( obj % dbcJA, 'dbcJA') +call display( obj % dbcIndx, 'dbcIndx') +end program main \ No newline at end of file diff --git a/docs/docs-api/LIS/examples/extra-examples/test-3.F90 b/docs/docs-api/LIS/examples/extra-examples/test-3.F90 new file mode 100644 index 00000000..7eb83b4d --- /dev/null +++ b/docs/docs-api/LIS/examples/extra-examples/test-3.F90 @@ -0,0 +1,72 @@ +!<--- test of set dirichlet boundary nodes +program main +use easifem +implicit none + +type( sparsematrix_ ) :: tanmat +real( dfp ), allocatable :: mat( :, : ) +type( intvector_ ) :: nptrs( 5 ) + +type( lis_ ) :: obj +INTEGER( I4B ) :: maxiter +REAL( DFP ) :: tol + +!<--- make tanmat +! make csr matrix +call display( 'flag1' ) +call initiate( obj = tanmat, tdof = 1, tnodes = [10] ) +call setsparsity( obj = tanmat, row = 1, col = [1,2] ) +call setsparsity( obj = tanmat, row = 2, col = [1,2,3] ) +call setsparsity( obj = tanmat, row = 3, col = [2,3,4] ) +call setsparsity( obj = tanmat, row = 4, col = [3,4,5] ) +call setsparsity( obj = tanmat, row = 5, col = [4,5,6] ) +call setsparsity( obj = tanmat, row = 6, col = [5,6,7] ) +call setsparsity( obj = tanmat, row = 7, col = [6,7,8] ) +call setsparsity( obj = tanmat, row = 8, col = [7,8,9] ) +call setsparsity( obj = tanmat, row = 9, col = [8,9,10] ) +call setsparsity( obj = tanmat, row = 10, col = [9,10] ) +call display( 'flag2' ) +call setsparsity( tanmat ) +call display( 'flag3' ) +allocate( mat( 2, 2 ) ) +mat = reshape( [1,-1,-1,1], [2,2]) +call addcontribution( tanmat, [1,2], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [2,3], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [3,4], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [4,5], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [5,6], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [6,7], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [7,8], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [8,9], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [9,10], mat, 1.0_dfp, NONE) +call display( 'flag4' ) +call convert( from = tanmat, to = mat ) +call display( 'flag5' ) +call display( mat, 'mat' ) +call display( 'flag6' ) +!<--- +tol = 1.0e-5 +maxiter = 10 + +call initiate( & + & obj = obj, & + & Solvername = lis_cg, & + & Maxiter = maxiter, & + & Tol = tol ) + +call display( 'flag7' ) + +call setPrecondition( & + & obj = obj, & + & precondType = p_none ) +call display( 'flag8' ) +call setsparsity( From = tanmat, To = obj ) +call display( 'flag9' ) + +nptrs( 1 ) % val = [1,10] +call setDirichletBCNodes( obj = obj, Nptrs = nptrs, dofs=[1] ) +call display( obj % dbcNptrs, 'dbcNptrs') +call display( obj % dbcIA, 'dbcIA') +call display( obj % dbcJA, 'dbcJA') +call display( obj % dbcIndx, 'dbcIndx') +end program main \ No newline at end of file diff --git a/docs/docs-api/LIS/examples/extra-examples/test-4.F90 b/docs/docs-api/LIS/examples/extra-examples/test-4.F90 new file mode 100644 index 00000000..2a4c6d7b --- /dev/null +++ b/docs/docs-api/LIS/examples/extra-examples/test-4.F90 @@ -0,0 +1,67 @@ +!<--- test of set dirichlet boundary nodes +program main +use easifem +implicit none + +#include "lisf.h" + +type( sparsematrix_ ) :: tanmat +real( dfp ), allocatable :: mat( :, : ), sol( : ), rhs( : ) +type( lis_ ) :: obj +INTEGER( I4B ) :: maxiter +REAL( DFP ) :: tol + +!<--- make tanmat +! make csr matrix +call initiate( obj = tanmat, tdof = 1, tnodes = [10] ) +call setsparsity( obj = tanmat, row = 1, col = [1,2] ) +call setsparsity( obj = tanmat, row = 2, col = [1,2,3] ) +call setsparsity( obj = tanmat, row = 3, col = [2,3,4] ) +call setsparsity( obj = tanmat, row = 4, col = [3,4,5] ) +call setsparsity( obj = tanmat, row = 5, col = [4,5,6] ) +call setsparsity( obj = tanmat, row = 6, col = [5,6,7] ) +call setsparsity( obj = tanmat, row = 7, col = [6,7,8] ) +call setsparsity( obj = tanmat, row = 8, col = [7,8,9] ) +call setsparsity( obj = tanmat, row = 9, col = [8,9,10] ) +call setsparsity( obj = tanmat, row = 10, col = [9,10] ) +call setsparsity( tanmat ) +allocate( mat( 2, 2 ) ) +mat = reshape( [1,-1,-1,1], [2,2]) +call addcontribution( tanmat, [1,2], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [2,3], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [3,4], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [4,5], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [5,6], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [6,7], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [7,8], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [8,9], mat, 1.0_dfp, NONE) +call addcontribution( tanmat, [9,10], mat, 1.0_dfp, NONE) +call display( 'flag4' ) +call convert( from = tanmat, to = mat ) +call display( 'flag5' ) +call display( mat, 'mat' ) +call display( 'flag6' ) +allocate( rhs( 10 ), sol( 10 ) ); rhs = 0; sol = 0; sol( 10 ) = 0.5 + +!<--- +tol = 1.0e-5 +maxiter = 10 + +call initiate( & + & obj = obj, & + & Solvername = lis_cg, & + & Maxiter = maxiter, & + & Tol = tol ) + +call setPrecondition( & + & obj = obj, & + & precondType = p_iluk, & + & ipar = [0] ) + +call setsparsity( From = tanmat, To = obj ) +call setDirichletBCNodes( obj = obj, Nptrs = [1,10], dofs=[1] ) +call convert( from = tanmat, to = obj ) +call solve( obj = obj, rhs = rhs, sol = sol ) +call display( sol, 'sol' ) + +end program main \ No newline at end of file diff --git a/docs/docs-api/LIS/examples/runner.toml b/docs/docs-api/LIS/examples/runner.toml new file mode 100644 index 00000000..6dde73db --- /dev/null +++ b/docs/docs-api/LIS/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/LIS" +TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/LIS/examples/test-1.F90 b/docs/docs-api/LIS/examples/test-1.F90 index d745e993..3a3baa99 100644 --- a/docs/docs-api/LIS/examples/test-1.F90 +++ b/docs/docs-api/LIS/examples/test-1.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-08 +! summary: Initiate LIS vector and set values + PROGRAM main ! USE easifemBase #include "lisf.h" diff --git a/docs/docs-api/LIS/examples/test-2.F90 b/docs/docs-api/LIS/examples/test-2.F90 index dc96419e..f35381a5 100644 --- a/docs/docs-api/LIS/examples/test-2.F90 +++ b/docs/docs-api/LIS/examples/test-2.F90 @@ -1,5 +1,10 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-08 +! summary: Initiate Matrix and set values + PROGRAM main -USE easifemBase +USE GlobalData, ONLY: DFP, LGT, I4B + #include "lisf.h" INTEGER :: ierr diff --git a/docs/docs-api/LIS/examples/test-3.F90 b/docs/docs-api/LIS/examples/test-3.F90 index 5c251716..35cd9c9b 100644 --- a/docs/docs-api/LIS/examples/test-3.F90 +++ b/docs/docs-api/LIS/examples/test-3.F90 @@ -1,11 +1,15 @@ PROGRAM main -USE easifemBase +USE BaseType, ONLY: CSRMatrix_ +USE GlobalData, ONLY: DFP, I4B, LGT +USE Display_Method +USE CSRMatrix_Method +USE ReallocateUtility + #include "lisf.h" -! CHARACTER(*), PARAMETER :: matrix_name = "../../CSRMatrix/matrixMarket/e40r0000.mtx" -! CHARACTER(*), PARAMETER :: rhs_name = "../../CSRMatrix/matrixMarket/e40r0000_rhs1.mtx" -CHARACTER(*), PARAMETER :: matrix_name = "../../CSRMatrix/matrixMarket/small5.mtx" -CHARACTER(*), PARAMETER :: rhs_name = "../../CSRMatrix/matrixMarket/small5_rhs.mtx" +CHARACTER(*), PARAMETER :: matrix_name = "../../CSRMatrix/examples/matrixMarket/small5.mtx" +CHARACTER(*), PARAMETER :: rhs_name = "../../CSRMatrix/examples/matrixMarket/small5_rhs.mtx" + INTEGER :: ierr LIS_MATRIX :: A TYPE(CSRMatrix_) :: csrmat diff --git a/docs/docs-api/LIS/examples/test-4.F90 b/docs/docs-api/LIS/examples/test-4.F90 index d5ca4356..f814adad 100644 --- a/docs/docs-api/LIS/examples/test-4.F90 +++ b/docs/docs-api/LIS/examples/test-4.F90 @@ -1,13 +1,16 @@ PROGRAM main -USE easifemBase -#include "lisf.h" +USE GlobalData +USE BaseType +USE CSRMatrix_Method +USE Display_Method +USE ReallocateUtility -CHARACTER(*), PARAMETER :: matrix_name = "../../CSRMatrix/matrixMarket/small5.mtx" -CHARACTER(*), PARAMETER :: rhs_name = "../../CSRMatrix/matrixMarket/small5_rhs.mtx" +#include "lisf.h" -! CHARACTER(*), PARAMETER :: matrix_name = "../../CSRMatrix/matrixMarket/e40r0000.mtx" -! CHARACTER(*), PARAMETER :: rhs_name = "../../CSRMatrix/matrixMarket/e40r0000_rhs1.mtx" +CHARACTER(*), PARAMETER :: matrix_name = "../../CSRMatrix/examples/matrixMarket/small5.mtx" +CHARACTER(*), PARAMETER :: rhs_name = "../../CSRMatrix/examples/matrixMarket/small5_rhs.mtx" INTEGER :: ierr + LIS_MATRIX :: A_ LIS_VECTOR :: rhs_, sol_ LIS_SOLVER :: solver @@ -56,7 +59,6 @@ PROGRAM main CALL lis_matrix_set_size(A_, 0, n, ierr) CALL lis_matrix_set_csr(nnz, ia, ja, csrmat%a, A_, ierr) CALL lis_matrix_assemble(A_, ierr) -CALL lis_matrix_set() CALL chkerr(ierr) CALL display("flag 1") diff --git a/docs/docs-api/LagrangeOneDimFE/LagrangeOneDimFE_.md b/docs/docs-api/LagrangeOneDimFE/LagrangeOneDimFE_.md new file mode 100644 index 00000000..05d21c2b --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/LagrangeOneDimFE_.md @@ -0,0 +1,3 @@ +# Structure + +The structure of LagrangeOneDimFE is given below. diff --git a/docs/docs-api/LagrangeOneDimFE/examples/LagrangeFE_test_2.md b/docs/docs-api/LagrangeOneDimFE/examples/LagrangeFE_test_2.md new file mode 100644 index 00000000..656d5264 --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/LagrangeFE_test_2.md @@ -0,0 +1,138 @@ +--- +author: Vikas Sharma, Ph.D. +date: 28 Aug 2022 +tags: + - LagrangeFE +--- + +# LagrangeFE example 2 + +In this exmple we test Lagrange finite element on Triangle element. +Interpolation points are equidistance. + +## Modules and classes + +- [[LagrangeFE_]] + +## Usage + +```fortran +PROGRAM main +use easifemBase +use easifemClasses +implicit none +type(LagrangeFE_) :: obj +integer(i4b) :: order +integer(i4b), parameter :: elemType=Triangle +character(len=*), parameter :: elemName="Triangle" +integer(i4b), parameter :: ipType=IP_EQUIDISTANCE +``` + +!!! note "Order=1" + +```fortran +order=1 +call obj%Initiate(elemType=elemType, order=order, ipType=ipType) +call obj%Display( elemName // "order=" //tostring(order) ) +``` + +!!! example "result" +order=1 +Total Basis=3 + +$$ +N(1)=+1-1 y^1-1x^1 +$$ + +$$ +N(2)=+1x^1 +$$ + +$$ +N(3)=+1 y^1 +$$ + +!!! note "Order=2" + +```fortran +order=2 +call blanklines(nol=3) +call obj%Initiate(elemType=elemType, order=order, ipType=ipType) +call obj%Display( elemName // "order=" //tostring(order) ) +``` + +!!! example "result" +order=2 +Total Basis=6 + +$$ +N(1)=+1-3 y^1+2 y^2+4x^1 y^1-3x^1+2x^2 +$$ +$$ +N(2)=-1x^1+2x^2 +$$ + +$$ +N(3)=-1 y^1+2 y^2 +$$ + +$$ +N(4)=-4x^1 y^1+4x^1-4x^2 +$$ + +$$ +N(5)=+4x^1 y^1 +$$ + +$$ +N(6)=+4 y^1-4 y^2-4x^1 y^1 +$$ + +!!! note "Order=3" + +```fortran +order=3 +call blanklines(nol=3) +call obj%Initiate(elemType=elemType, order=order, ipType=ipType) +call obj%Display( elemName // "order=" //tostring(order) ) +``` + +!!! example "result" +order=3 +Total Basis=10 + +$$ +N(1)=+1+9 y^2-5.5 y^1-4.5 y^3-13.5x^1 y^2+18x^1 y^1-5.5x^1+9x^2-13.5x^2 y^1-4.5x^3 +$$ + +$$ +N(2)=+1x^1-4.5x^2+4.5x^3 +$$ +$$ +N(3)=-4.5 y^2+1 y^1+4.5 y^3 +$$ +$$ +N(4)=+13.5x^1 y^2-22.5x^1 y^1+9x^1-22.5x^2+27x^2 y^1+13.5x^3 +$$ +$$ +N(5)=+4.5x^1 y^1-4.5x^1+18x^2-13.5x^2 y^1-13.5x^3 +$$ +$$ +N(6)=-4.5x^1 y^1+13.5x^2 y^1 +$$ +$$ +N(7)=+13.5x^1 y^2-4.5x^1 y^1 +$$ +$$ +N(8)=+18 y^2-4.5 y^1-13.5 y^3-13.5x^1 y^2+4.5x^1 y^1 +$$ +$$ +N(9)=-22.5 y^2+9 y^1+13.5 y^3+27x^1 y^2-22.5x^1 y^1+13.5x^2 y^1 +$$ +$$ +N(10)=-27x^1 y^2+27x^1 y^1-27x^2 y^1 +$$ + +```fortran +END PROGRAM main +``` diff --git a/docs/docs-api/LagrangeOneDimFE/examples/LagrangeFE_test_3.md b/docs/docs-api/LagrangeOneDimFE/examples/LagrangeFE_test_3.md new file mode 100644 index 00000000..fc42c9a7 --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/LagrangeFE_test_3.md @@ -0,0 +1,107 @@ +--- +author: Vikas Sharma, Ph.D. +date: 28 Aug 2022 +tags: + - LagrangeFE +--- + +# LagrangeFE example 3 + +In this exmple we test Lagrange finite element on Quadrangle element. +Interpolation points are equidistance. + +## Modules and classes + +- [[LagrangeFE_]] + +## Usage + +```fortran +PROGRAM main +use easifemBase +use easifemClasses +implicit none +type(LagrangeFE_) :: obj +integer(i4b) :: order +integer(i4b), parameter :: elemType=Quadrangle +character(len=*), parameter :: elemName="Quadrangle" +integer(i4b), parameter :: ipType=IP_EQUIDISTANCE +``` + +!!! note "Order=1" + +```fortran +order=1 +call obj%Initiate(elemType=elemType, order=order, ipType=ipType) +call obj%Display( elemName // "order=" //tostring(order) ) +``` + +!!! example "result" +order=1 +Total Basis=4 +$$ +N(1)=+0.25-0.25 y^1-0.25x^1+0.25x^1 y^1 +$$ +$$ +N(2)=+0.25-0.25 y^1+0.25x^1-0.25x^1 y^1 +$$ +$$ +N(3)=+0.25+0.25 y^1+0.25x^1+0.25x^1 y^1 +$$ +$$ +N(4)=+0.25+0.25 y^1-0.25x^1-0.25x^1 y^1 +$$ + +!!! note "Order=2" + +```fortran +order=2 +call blanklines(nol=3) +call obj%Initiate(elemType=elemType, order=order, ipType=ipType) +call obj%Display( elemName // "order=" //tostring(order) ) +``` + +!!! example "result" +order=2 +Total Basis=9 + +$$ +N(1)=+0.25x^1 y^1-0.25x^1 y^2-0.25x^2 y^1+0.25x^2 y^2 +$$ +$$ +N(2)=-0.25x^1 y^1+0.25x^1 y^2-0.25x^2 y^1+0.25x^2 y^2 +$$ +$$ +N(3)=+0.25x^1 y^1+0.25x^1 y^2+0.25x^2 y^1+0.25x^2 y^2 +$$ +$$ +N(4)=-0.25x^1 y^1-0.25x^1 y^2+0.25x^2 y^1+0.25x^2 y^2 +$$ +$$ +N(5)=+0.5 y^2-0.5 y^1+0.5x^2 y^1-0.5x^2 y^2 +$$ +$$ +N(6)=+0.5x^1-0.5x^1 y^2+0.5x^2-0.5x^2 y^2 +$$ +$$ +N(7)=+0.5 y^2+0.5 y^1-0.5x^2 y^1-0.5x^2 y^2 +$$ +$$ +N(8)=-0.5x^1+0.5x^1 y^2+0.5x^2-0.5x^2 y^2 +$$ +$$ +N(9)=+1-1 y^2-1x^2+1x^2 y^2 +$$ + +!!! note "Order=3" + +```fortran +order=3 +call blanklines(nol=3) +call obj%Initiate(elemType=elemType, order=order, ipType=ipType) +call obj%Display( elemName // "order=" //tostring(order) ) +``` + +```fortran +END PROGRAM main +``` diff --git a/docs/docs-api/LagrangeOneDimFE/examples/LagrangePointer_test_1.F90 b/docs/docs-api/LagrangeOneDimFE/examples/LagrangePointer_test_1.F90 new file mode 100644 index 00000000..e8627ffa --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/LagrangePointer_test_1.F90 @@ -0,0 +1,56 @@ +! In this exmple we test Lagrange finite element on Line element. +! Interpolation points are equidistance. + +! MODULE FUNCTION obj_LagrangeFEPointer(elemType, nsd, baseContinuity, & +! baseInterpolation, ipType, basisType, alpha, beta, lambda, order, & +! anisoOrder) RESULT(ans) + +PROGRAM main +USE GlobalData +USE ReferenceElement_Method +USE BaseType +USE Display_Method +USE AbstractFE_Class +USE LagrangeFE_Class + +IMPLICIT NONE + +CLASS(AbstractFE_), POINTER :: obj + +INTEGER(I4B) :: elemType, nsd, ipType, basisType(3), order, anisoOrder(3) +REAL(DFP) :: alpha(3), beta(3), lambda(3) + +CHARACTER(:), ALLOCATABLE :: testname, baseContinuity + +elemType = Line +nsd = Xidimension(elemType) +ipType = TypeInterpolationOpt%equidistance +baseContinuity = "H1" +basisType = TypePolynomialOpt%monomial +alpha = 0.0 +beta = 0.0 +lambda = 0.0 +order = 4 +testname = "Line, H1, Lagrange, order=4, equidistance" +CALL callme + +basisType = typePolynomialOpt%legendre +iptype = TypeInterpolationOpt%GaussLegendreLobatto +testname = "Line, H1, Lagrange, order=4, gauss legendre lobatto" +CALL callme + +CONTAINS +SUBROUTINE callme + + obj => LagrangeFEPointer(elemType=elemType, nsd=nsd, & + baseContinuity=baseContinuity, & + ipType=ipType, basisType=basisType, alpha=alpha, beta=beta, lambda=lambda, & + order=order) + + CALL obj%Display(testname) + + CALL obj%DEALLOCATE() + DEALLOCATE (obj) +END SUBROUTINE callme + +END PROGRAM main diff --git a/docs/docs-api/LagrangeOneDimFE/examples/LocalElementShapeData_test_1.F90 b/docs/docs-api/LagrangeOneDimFE/examples/LocalElementShapeData_test_1.F90 new file mode 100644 index 00000000..51dd5260 --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/LocalElementShapeData_test_1.F90 @@ -0,0 +1,75 @@ +! In this exmple we test Lagrange finite element on Line element. +! Interpolation points are equidistance. + +! MODULE FUNCTION obj_LagrangeFEPointer(elemType, nsd, baseContinuity, & +! baseInterpolation, ipType, basisType, alpha, beta, lambda, order, & +! anisoOrder) RESULT(ans) + +! MODULE SUBROUTINE obj_GetQuadraturePoints1(obj, quad, quadratureType, & +! order, alpha, beta, lambda) + +PROGRAM main +USE GlobalData +USE ReferenceElement_Method +USE BaseType +USE Display_Method +USE AbstractFE_Class +USE LagrangeFE_Class +USE QuadraturePoint_Method +USE ElemshapeData_Method + +IMPLICIT NONE +TYPE(QuadraturePoint_) :: quad +TYPE(ElemShapeData_) :: elemsd +CLASS(AbstractFE_), POINTER :: obj + +INTEGER(I4B) :: elemType, nsd, ipType, basisType(3), order, anisoOrder(3) +REAL(DFP) :: alpha(3), beta(3), lambda(3) +REAL(DFP) :: alpha_quad, beta_quad, lambda_quad +INTEGER(I4B) :: quadratureType, order_quad + +CHARACTER(:), ALLOCATABLE :: testname, baseContinuity + +elemType = Line +nsd = Xidimension(elemType) +ipType = TypeInterpolationOpt%GaussLegendreLobatto +baseContinuity = "H1" +basisType = TypePolynomialOpt%Legendre +alpha = 0.0 +beta = 0.0 +lambda = 0.0 +order = 4 +order_quad = 4 +quadratureType = TypeQuadratureOpt%GaussLegendreLobatto +alpha_quad = 0.0 +beta_quad = 0.0 +lambda_quad = 0.0 +testname = "Line, H1, Legendre, order=4, GaussLegendreLobatto" +CALL callme + +CONTAINS +SUBROUTINE callme + + obj => LagrangeFEPointer(elemType=elemType, nsd=nsd, & + baseContinuity=baseContinuity, & + ipType=ipType, basisType=basisType, alpha=alpha, & + beta=beta, lambda=lambda, & + order=order) + + CALL obj%GetQuadraturePoints(quad=quad, quadratureType=quadratureType, & + order=order_quad, alpha=alpha_quad, beta=beta_quad, lambda=lambda_quad) + + CALL obj%GetLocalElemShapeData(elemsd=elemsd, quad=quad) + + CALL Display(testname) + CALL display(elemsd%N, "N") + CALL display(elemsd%dNdXi, "dNdXi") + + CALL obj%DEALLOCATE() + CALL DEALLOCATE (quad) + CALL DEALLOCATE (elemsd) + + DEALLOCATE (obj) +END SUBROUTINE callme + +END PROGRAM main diff --git a/docs/docs-api/LagrangeOneDimFE/examples/QuadraturePoint_test_1.F90 b/docs/docs-api/LagrangeOneDimFE/examples/QuadraturePoint_test_1.F90 new file mode 100644 index 00000000..87e715ec --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/QuadraturePoint_test_1.F90 @@ -0,0 +1,84 @@ +! In this exmple we test Lagrange finite element on Line element. +! Interpolation points are equidistance. + +! MODULE FUNCTION obj_LagrangeFEPointer(elemType, nsd, baseContinuity, & +! baseInterpolation, ipType, basisType, alpha, beta, lambda, order, & +! anisoOrder) RESULT(ans) + +! MODULE SUBROUTINE obj_GetQuadraturePoints1(obj, quad, quadratureType, & +! order, alpha, beta, lambda) + +PROGRAM main +USE GlobalData +USE ReferenceElement_Method +USE BaseType +USE Display_Method +USE AbstractFE_Class +USE LagrangeFE_Class +USE QuadraturePoint_Method + +IMPLICIT NONE +TYPE(QuadraturePoint_) :: quad +CLASS(AbstractFE_), POINTER :: obj + +INTEGER(I4B) :: elemType, nsd, ipType, basisType(3), order, anisoOrder(3) +REAL(DFP) :: alpha(3), beta(3), lambda(3) +REAL(DFP) :: alpha_quad, beta_quad, lambda_quad +INTEGER(I4B) :: quadratureType, order_quad + +CHARACTER(:), ALLOCATABLE :: testname, baseContinuity + +elemType = Line +nsd = Xidimension(elemType) +ipType = TypeInterpolationOpt%equidistance +baseContinuity = "H1" +basisType = TypePolynomialOpt%monomial +alpha = 0.0 +beta = 0.0 +lambda = 0.0 +order = 4 +order_quad = 4 +quadratureType = TypeQuadratureOpt%GaussLegendre +alpha_quad = 0.0 +beta_quad = 0.0 +lambda_quad = 0.0 +testname = "Line, H1, Monomial, order=4, equidistance" +CALL callme + +elemType = Line +nsd = Xidimension(elemType) +ipType = TypeInterpolationOpt%GaussLegendreLobatto +baseContinuity = "H1" +basisType = TypePolynomialOpt%Legendre +alpha = 0.0 +beta = 0.0 +lambda = 0.0 +order = 4 +order_quad = 4 +quadratureType = TypeQuadratureOpt%GaussLegendreLobatto +alpha_quad = 0.0 +beta_quad = 0.0 +lambda_quad = 0.0 +testname = "Line, H1, Legendre, order=4, GaussLegendreLobatto" +CALL callme + +CONTAINS +SUBROUTINE callme + + obj => LagrangeFEPointer(elemType=elemType, nsd=nsd, & + baseContinuity=baseContinuity, & + ipType=ipType, basisType=basisType, alpha=alpha, & + beta=beta, lambda=lambda, & + order=order) + + CALL obj%GetQuadraturePoints(quad=quad, quadratureType=quadratureType, & + order=order_quad, alpha=alpha_quad, beta=beta_quad, lambda=lambda_quad) + + CALL display(quad, testname) + CALL obj%DEALLOCATE() + CALL DEALLOCATE (quad) + + DEALLOCATE (obj) +END SUBROUTINE callme + +END PROGRAM main diff --git a/docs/docs-api/LagrangeOneDimFE/examples/QuadraturePoint_test_2.F90 b/docs/docs-api/LagrangeOneDimFE/examples/QuadraturePoint_test_2.F90 new file mode 100644 index 00000000..a230a83c --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/QuadraturePoint_test_2.F90 @@ -0,0 +1,86 @@ +! In this exmple we test Lagrange finite element on Line element. +! Interpolation points are equidistance. + +! MODULE FUNCTION obj_LagrangeFEPointer(elemType, nsd, baseContinuity, & +! baseInterpolation, ipType, basisType, alpha, beta, lambda, order, & +! anisoOrder) RESULT(ans) + +! MODULE SUBROUTINE obj_GetQuadraturePoints1(obj, quad, quadratureType, & +! order, alpha, beta, lambda) + +PROGRAM main +USE GlobalData +USE ReferenceElement_Method +USE BaseType +USE Display_Method +USE AbstractFE_Class +USE LagrangeFE_Class +USE QuadraturePoint_Method + +IMPLICIT NONE +TYPE(QuadraturePoint_) :: quad +CLASS(AbstractFE_), POINTER :: obj + +INTEGER(I4B) :: elemType, nsd, ipType, basisType(3), order, anisoOrder(3) +REAL(DFP) :: alpha(3), beta(3), lambda(3) +REAL(DFP) :: alpha_quad, beta_quad, lambda_quad +INTEGER(I4B) :: quadratureType, order_quad + +CHARACTER(:), ALLOCATABLE :: testname, baseContinuity + +elemType = Triangle +nsd = Xidimension(elemType) +ipType = TypeInterpolationOpt%equidistance +baseContinuity = "H1" +basisType = TypePolynomialOpt%monomial +alpha = 0.0 +beta = 0.0 +lambda = 0.0 +order = 4 +order_quad = 4 +quadratureType = TypeQuadratureOpt%GaussLegendre +alpha_quad = 0.0 +beta_quad = 0.0 +lambda_quad = 0.0 +testname = "Triangle, H1, Monomial, order=4, equidistance" +CALL callme + +! elemType = Line +! nsd = Xidimension(elemType) +! ipType = TypeInterpolationOpt%GaussLegendreLobatto +! baseContinuity = "H1" +! basisType = TypePolynomialOpt%Legendre +! alpha = 0.0 +! beta = 0.0 +! lambda = 0.0 +! order = 4 +! order_quad = 4 +! quadratureType = TypeQuadratureOpt%GaussLegendreLobatto +! alpha_quad = 0.0 +! beta_quad = 0.0 +! lambda_quad = 0.0 +! testname = "Line, H1, Legendre, order=4, GaussLegendreLobatto" +! CALL callme + +CONTAINS +SUBROUTINE callme + + obj => LagrangeFEPointer(elemType=elemType, nsd=nsd, & + baseContinuity=baseContinuity, & + ipType=ipType, basisType=basisType, alpha=alpha, & + beta=beta, lambda=lambda, & + order=order) + + CALL obj%GetQuadraturePoints(quad=quad, quadratureType=quadratureType, & + order=order_quad, alpha=alpha_quad, beta=beta_quad, lambda=lambda_quad) + + CALL Display(SUM(quad%points(nsd + 1, :)), "sum of weights") + + CALL display(quad, testname) + CALL obj%DEALLOCATE() + CALL DEALLOCATE (quad) + + DEALLOCATE (obj) +END SUBROUTINE callme + +END PROGRAM main diff --git a/docs/docs-api/LagrangeOneDimFE/examples/_Initiate_test_1.F90 b/docs/docs-api/LagrangeOneDimFE/examples/_Initiate_test_1.F90 new file mode 100644 index 00000000..53c02315 --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/_Initiate_test_1.F90 @@ -0,0 +1,92 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-17 +! summary: This example tests the initiate method for LagrangeOneDimFE class. +! In this exmple we test Lagrange finite element on Line element. +! Interpolation points are equidistance. +! We will use equidistance interpolation points +! We also test LagrangeOneDimFE function to initiate the object + +PROGRAM main +USE LagrangeOneDimFE_Class +USE GlobalData +USE BaseType, ONLY: ipopt => TypeInterpolationOpt, & + varopt => TypeFEVariableOpt, & + polyopt => TypePolynomialOpt +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(LagrangeOneDimFE_) :: obj + +INTEGER(I4B) :: order +CHARACTER(LEN=*), PARAMETER :: baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation +INTEGER(I4B), PARAMETER :: ipType = ipopt%Equidistance, & + feType = varopt%scalar, & + basisType = polyopt%monomial + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + ipType=ipType, & + basisType=basisType, & + order=order, & + feType=feType) + + CALL obj%Display(testname//" test 1") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + ipType=ipType, & + basisType=basisType, & + order=order, & + feType=feType) + + CALL obj%Display(testname//" test 2") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + +! We can also initiate the object by using the function +! In this case we do not have to specify the +! baseInterpolation and feType parameters + + order = 3 + obj = LagrangeOneDimFE(baseContinuity=baseContinuity, & + ipType=ipType, & + basisType=basisType, & + order=order) + + CALL obj%Display(testname//" test 3") + +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/LagrangeOneDimFE/examples/_Initiate_test_1.md b/docs/docs-api/LagrangeOneDimFE/examples/_Initiate_test_1.md new file mode 100644 index 00000000..1fd50537 --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/_Initiate_test_1.md @@ -0,0 +1,81 @@ +In this exmple we test Lagrange finite element on Line element. +Interpolation points are equidistance. + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_1.F90'; + +{CodeSnippet} + +The explanation and the results of the above code is given below. + +### The results of Order=1 + +$$ +N(1)=+0.5x^0-0.5x^1 +$$ + +$$ +N(2)=+0.5x^0+0.5x^1 +$$ + +```txt +ReferenceElement= +element type : Line2 +xidimension :: 1 +nsd : 1 +nsd=1 +order=1 +feType=1 +ipType=1 +dofType= +-------- +1 +1 +1 +1 +transformType=1 + +order=1 +Total Basis=2 +N(1)=+0.5x^0-0.5x^1 +N(2)=+0.5x^0+0.5x^1 +``` + +### The results of Order=2 + +- order=2 +- Total Basis=3 + +$$ +N(1)=-0.5x^1+0.5x^2 +$$ + +$$ +N(2)=+0.5x^1+0.5x^2 +$$ + +$$ +N(3)=+1x^0-1x^2 +$$ + +### The results of order 3 are given below + +- order=3 +- Total Basis=4 + +$$ +N(1)=-6.25E-02x^0+6.25E-02x^1+0.5625x^2-0.5625x^3 +$$ + +$$ +N(2)=-6.25E-02x^0-6.25E-02x^1+0.5625x^2+0.5625x^3 +$$ + +$$ +N(3)=+0.5625x^0-1.6875x^1-0.5625x^2+1.6875x^3 +$$ + +$$ +N(4)=+0.5625x^0+1.6875x^1-0.5625x^2-1.6875x^3 +$$ diff --git a/docs/docs-api/LagrangeOneDimFE/examples/runner.toml b/docs/docs-api/LagrangeOneDimFE/examples/runner.toml new file mode 100644 index 00000000..89fa13bc --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/LagrangeOneDimFE" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/LagrangeOneDimFE/index.md b/docs/docs-api/LagrangeOneDimFE/index.md new file mode 100644 index 00000000..909462e7 --- /dev/null +++ b/docs/docs-api/LagrangeOneDimFE/index.md @@ -0,0 +1,28 @@ +--- +sidebar_position: 1 +date: 2023-08-05 +update: 2023-08-05 +status: stable +docs: done +extpkgs: none +category: + - Basis + - Polynomials + - ShapeFunctions +tags: + - basis + - polynomials + - shapeFunctions + - easifemClasses +--- + +# LagrangeOneDimFE + +LagrangeOneDimFE is a class for one-dimensional Lagrange finite elements. +It is a child of ScalarOneDimFE. + +## All methods + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/docs-api/MPI/examples/runner.toml b/docs/docs-api/MPI/examples/runner.toml new file mode 100644 index 00000000..179d25ef --- /dev/null +++ b/docs/docs-api/MPI/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/MPI/" +TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/MPI/examples/test1.F90 b/docs/docs-api/MPI/examples/test1.F90 new file mode 100644 index 00000000..fef9317b --- /dev/null +++ b/docs/docs-api/MPI/examples/test1.F90 @@ -0,0 +1,18 @@ +PROGRAM main +USE mpi_f08 + +IMPLICIT NONE + +TYPE(MPI_Comm) :: comm +INTEGER :: rank, size + +CALL MPI_Init() +comm = MPI_COMM_WORLD + +CALL MPI_Comm_rank(comm, rank) +CALL MPI_Comm_size(comm, size) + +PRINT *, "Hello from rank ", rank, " of ", size + +CALL MPI_Finalize() +END PROGRAM main diff --git a/docs/docs-api/MPI/examples/test2.F90 b/docs/docs-api/MPI/examples/test2.F90 new file mode 100644 index 00000000..f06d3d6b --- /dev/null +++ b/docs/docs-api/MPI/examples/test2.F90 @@ -0,0 +1,9 @@ +PROGRAM main +USE MPI_Method + +IMPLICIT NONE + +CALL MPI_Initiate() +CALL MPI_Display("MPI: ") +CALL MPI_Deallocate() +END PROGRAM main diff --git a/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.F90 b/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.F90 index 9209ed7a..beb4390b 100644 --- a/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.F90 +++ b/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.F90 @@ -14,6 +14,7 @@ PROGRAM main ! Now we create an instance of [[ReferenceLine_]]. simplexElem = referenceline(nsd=1) + CALL simplexElem%LagrangeElement(order=orderForTest, highOrderObj=refElemForTest) CALL simplexElem%LagrangeElement(order=orderForTrial, highOrderObj=refElemForTrial) diff --git a/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.md b/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.md index 46292e44..d3daa624 100644 --- a/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.md +++ b/docs/docs-api/MassMatrix/examples/MassMatrix_test_3.md @@ -1,6 +1,6 @@ This example shows how to USE the SUBROUTINE called `MassMatrix` to create a mass matrix in space domain. -Here, we want to DO the following. +Here, we want to DO the following. $$ \int_{\Omega } N^{I}\rho N^{J}d\Omega @@ -15,4 +15,3 @@ $$ $$ This TYPE of mass matrix is useful when $rho$ is a constant. - diff --git a/docs/docs-api/MassMatrix/examples/MassMatrix_test_4.md b/docs/docs-api/MassMatrix/examples/MassMatrix_test_4.md index f9a97f09..d3daa624 100644 --- a/docs/docs-api/MassMatrix/examples/MassMatrix_test_4.md +++ b/docs/docs-api/MassMatrix/examples/MassMatrix_test_4.md @@ -1,6 +1,6 @@ This example shows how to USE the SUBROUTINE called `MassMatrix` to create a mass matrix in space domain. -Here, we want to DO the following. +Here, we want to DO the following. $$ \int_{\Omega } N^{I}\rho N^{J}d\Omega @@ -8,11 +8,10 @@ $$ `rho` can be a constant, or a FUNCTION of spatial coordinates, or some nonlinear FUNCTION. -In this example, following mass matrix is formed for ReferenceLine element, QuadraturePoint are `GaussLegendre`. +In this example, following mass matrix is formed for ReferenceLine element, QuadraturePoint are `GaussLegendre`. $$ \int_{\Omega } N^{I} N^{J}d\Omega $$ This TYPE of mass matrix is useful when $rho$ is a constant. - diff --git a/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.F90 b/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.F90 index b2987532..7433817e 100644 --- a/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.F90 +++ b/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.F90 @@ -33,8 +33,8 @@ PROGRAM main nns = order + 1 INTEGER(I4B), PARAMETER :: elemType = elem%line INTEGER(I4B), PARAMETER :: quadratureType = quadType%GaussLegendre -INTEGER( I4B ), PARAMETER :: interpolationType = iptype%GaussLegendreLobatto -INTEGER( I4B ), PARAMETER :: basisType = polyType%Monomial +INTEGER(I4B), PARAMETER :: interpolationType = iptype%GaussLegendreLobatto +INTEGER(I4B), PARAMETER :: basisType = polyType%Monomial REAL(DFP), PARAMETER :: refElemCoord(1, 2) = RESHAPE([-1.0_DFP, 1.0_DFP], [1, 2]) REAL(DFP), PARAMETER :: xij(1, 2) = RESHAPE([-1.0_DFP, 1.0_DFP], [1, 2]) diff --git a/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.md b/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.md index c276616f..4e03d0fd 100644 --- a/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.md +++ b/docs/docs-api/MassMatrix/examples/_MassMatrix_test_1.md @@ -1,7 +1,5 @@ - import CodeBlock from '@theme/CodeBlock'; import CodeSnippet from '!!raw-loader!./_MassMatrix_test_1.F90'; {CodeSnippet} - diff --git a/docs/docs-api/MassMatrix/examples/_MassMatrix_test_2.F90 b/docs/docs-api/MassMatrix/examples/_MassMatrix_test_2.F90 index f12ae90a..4ad28b2f 100644 --- a/docs/docs-api/MassMatrix/examples/_MassMatrix_test_2.F90 +++ b/docs/docs-api/MassMatrix/examples/_MassMatrix_test_2.F90 @@ -1,7 +1,3 @@ -<<<<<<< HEAD -PROGRAM main -USE easifemBase - PROGRAM main USE easifemBase diff --git a/docs/docs-api/MatrixField/examples/_Initiate_test_1.F90 b/docs/docs-api/MatrixField/examples/_Initiate_test_1.F90 index d282127e..23eccdda 100644 --- a/docs/docs-api/MatrixField/examples/_Initiate_test_1.F90 +++ b/docs/docs-api/MatrixField/examples/_Initiate_test_1.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-11 +! summary: This program demonstrates the initiation of a MatrixField object + PROGRAM main USE GlobalData USE FPL @@ -6,16 +10,18 @@ PROGRAM main USE FEMesh_Class USE MatrixField_Class USE FEDOF_Class -USE ExceptionHandler_Class +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +use BaseType, only: TypeQuadratureOpt IMPLICIT NONE -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" INTEGER(I4B), PARAMETER :: nsd = 2 INTEGER(I4B), PARAMETER :: spaceCompo = 1, timeCompo = 1 INTEGER(I4B), PARAMETER :: fieldType = TypeField%normal INTEGER(I4B), PARAMETER :: order = 1 +INTEGER( I4B ), PARAMETER :: ipType = TypeQuadratureOpt%equidistance CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" CHARACTER(*), PARAMETER :: baseContinuity = "H1" @@ -39,7 +45,7 @@ PROGRAM main CALL fedof%Initiate(baseContinuity=baseContinuity, & baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) + order=order, mesh=mesh, ipType=ipType) CALL mesh%DisplayMeshInfo("mesh info:") diff --git a/docs/docs-api/MatrixField/examples/_Initiate_test_1.md b/docs/docs-api/MatrixField/examples/_Initiate_test_1.md index 14715f36..781fb571 100644 --- a/docs/docs-api/MatrixField/examples/_Initiate_test_1.md +++ b/docs/docs-api/MatrixField/examples/_Initiate_test_1.md @@ -1,61 +1,5 @@ -```fortran -PROGRAM main -USE GlobalData -USE FPL -USE HDF5File_Class -USE AbstractField_Class, ONLY: TypeField -USE FEMesh_Class -USE MatrixField_Class -USE FEDOF_Class -USE ExceptionHandler_Class +import CodeBlock from '@theme/CodeBlock'; -IMPLICIT NONE +import CodeSnippet from '!!raw-loader!./_Initiate_test_1.F90'; -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B), PARAMETER :: spaceCompo = 1, timeCompo = 1 -INTEGER(I4B), PARAMETER :: fieldType = TypeField%normal -INTEGER(I4B), PARAMETER :: order = 1 - -CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: baseContinuity = "H1" -CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - -TYPE(FEMesh_) :: mesh -TYPE(MatrixField_) :: obj -TYPE(HDF5File_) :: meshfile -TYPE(FEDOF_) :: fedof -TYPE(ParameterList_) :: param -INTEGER(I4B) :: ierr - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_INIT(); CALL param%Initiate() - -CALL meshfile%Initiate(filename=filename, mode="READ") -CALL meshfile%OPEN() -CALL mesh%Initiate(hdf5=meshfile, dim=nsd) -CALL meshfile%DEALLOCATE() - -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) - -CALL mesh%DisplayMeshInfo("mesh info:") - -CALL SetMatrixFieldParam(param=param, name="K", matrixProp="UNSYM", & - spaceCompo=spaceCompo, timeCompo=timeCompo, & - fieldType=fieldType, engine=engine) - -CALL obj%Initiate(param=param, fedof=fedof) - -CALL obj%Display("MatrixField obj:") - -CALL obj%DEALLOCATE() -CALL mesh%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() - -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/MatrixField/examples/_Initiate_test_2.F90 b/docs/docs-api/MatrixField/examples/_Initiate_test_2.F90 index 887b78a9..3d5f1c7b 100644 --- a/docs/docs-api/MatrixField/examples/_Initiate_test_2.F90 +++ b/docs/docs-api/MatrixField/examples/_Initiate_test_2.F90 @@ -1,4 +1,6 @@ -! In this example we initiate an instance of +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-11 +! summary: In this example we initiate an instance of ! Matrix by copying contents from other matrix. PROGRAM main @@ -10,15 +12,17 @@ PROGRAM main USE MatrixField_Class USE FEDOF_Class USE ExceptionHandler_Class +use BaseType, only: TypeQuadratureOpt IMPLICIT NONE -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5" +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" INTEGER(I4B), PARAMETER :: nsd = 2 INTEGER(I4B), PARAMETER :: spaceCompo = 1, timeCompo = 1 INTEGER(I4B), PARAMETER :: fieldType = TypeField%normal INTEGER(I4B), PARAMETER :: order = 1 +INTEGER( I4B ), PARAMETER :: ipType = TypeQuadratureOpt%equidistance CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" CHARACTER(*), PARAMETER :: baseContinuity = "H1" @@ -42,7 +46,7 @@ PROGRAM main CALL fedof%Initiate(baseContinuity=baseContinuity, & baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) + order=order, mesh=mesh, ipType=ipType) CALL mesh%DisplayMeshInfo("mesh info:") diff --git a/docs/docs-api/MatrixField/examples/_Initiate_test_2.md b/docs/docs-api/MatrixField/examples/_Initiate_test_2.md index 19f22576..9e54927e 100644 --- a/docs/docs-api/MatrixField/examples/_Initiate_test_2.md +++ b/docs/docs-api/MatrixField/examples/_Initiate_test_2.md @@ -1,66 +1,5 @@ -```fortran -! In this example we initiate an instance of -! Matrix by copying contents from other matrix. +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE GlobalData -USE FPL -USE HDF5File_Class -USE AbstractField_Class, ONLY: TypeField -USE FEMesh_Class -USE MatrixField_Class -USE FEDOF_Class -USE ExceptionHandler_Class +import CodeSnippet from '!!raw-loader!./_Initiate_test_2.F90'; -IMPLICIT NONE - -CHARACTER(*), PARAMETER :: filename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B), PARAMETER :: spaceCompo = 1, timeCompo = 1 -INTEGER(I4B), PARAMETER :: fieldType = TypeField%normal -INTEGER(I4B), PARAMETER :: order = 1 - -CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: baseContinuity = "H1" -CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - -TYPE(FEMesh_) :: mesh -TYPE(MatrixField_) :: obj, obj2 -TYPE(HDF5File_) :: meshfile -TYPE(FEDOF_) :: fedof -TYPE(ParameterList_) :: param -INTEGER(I4B) :: ierr - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_INIT(); CALL param%Initiate() - -CALL meshfile%Initiate(filename=filename, mode="READ") -CALL meshfile%OPEN() -CALL mesh%Initiate(hdf5=meshfile, dim=nsd) -CALL meshfile%DEALLOCATE() - -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) - -CALL mesh%DisplayMeshInfo("mesh info:") - -CALL SetMatrixFieldParam(param=param, name="K", matrixProp="UNSYM", & - spaceCompo=spaceCompo, timeCompo=timeCompo, & - fieldType=fieldType, engine=engine) - -CALL obj%Initiate(param=param, fedof=fedof) - -CALL obj2%Initiate(obj) - -CALL obj2%Display("MatrixField obj:") - -CALL obj%DEALLOCATE() -CALL mesh%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() - -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/MatrixField/examples/runner.toml b/docs/docs-api/MatrixField/examples/runner.toml index b12504a3..9a44b819 100644 --- a/docs/docs-api/MatrixField/examples/runner.toml +++ b/docs/docs-api/MatrixField/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/matrixfield/" +BuildDir = "/tmp/easifem-tests/MatrixField" TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/MatrixField/index.md b/docs/docs-api/MatrixField/index.md index 8f2c8c22..cf4f823e 100644 --- a/docs/docs-api/MatrixField/index.md +++ b/docs/docs-api/MatrixField/index.md @@ -17,8 +17,6 @@ tags: # MatrixField - - `MatrixField_` is a class that represents a field of matrix. ## All methods diff --git a/docs/docs-api/MatrixFieldLis/examples/_Initiate_test_1.F90 b/docs/docs-api/MatrixFieldLis/examples/_Initiate_test_1.F90 new file mode 100644 index 00000000..c2ed1bb2 --- /dev/null +++ b/docs/docs-api/MatrixFieldLis/examples/_Initiate_test_1.F90 @@ -0,0 +1,47 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing import from toml +! In this example we will initiate MatrixField from ScalarField +! We initiate ScalarField from toml file + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE GlobalData +USE ScalarField_Class +USE ScalarFieldLis_Class +USE MatrixField_Class +USE MatrixFieldLis_Class +USE FieldFactory, ONLY: ScalarFieldFactory +USE FieldFactory, ONLY: MatrixFieldFactory +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE FEDOF_Class +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: math => TypeMathOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./_Initiate_test_1.toml", & + myName = "main", & + modName = "_Initiate_test_1.F90", & + engine = "LIS_OMP" +TYPE(FEDomain_) :: dom +TYPE(FEDOF_) :: fedof, geofedof +CLASS(ScalarField_), POINTER :: u +CLASS(MatrixField_), POINTER :: mat + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain") + +u => ScalarFieldFactory(engine) +CALL u%ImportFromToml( & + fedof=fedof, geofedof=geofedof, dom=dom, fileName=tomlFileName, & + tomlName="u") + +mat => MatrixFieldFactory(engine) +CALL mat%Initiate(obj2=u, copyFull=math%yes) + +CALL mat%Display(myName//" mat: ") + +END PROGRAM main diff --git a/docs/docs-api/MatrixFieldLis/examples/_Initiate_test_1.toml b/docs/docs-api/MatrixFieldLis/examples/_Initiate_test_1.toml new file mode 100644 index 00000000..6bbf8260 --- /dev/null +++ b/docs/docs-api/MatrixFieldLis/examples/_Initiate_test_1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "LIS_OMP" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/MatrixFieldLis/examples/mesh/main.F90 b/docs/docs-api/MatrixFieldLis/examples/mesh/main.F90 new file mode 100644 index 00000000..cf0cd946 --- /dev/null +++ b/docs/docs-api/MatrixFieldLis/examples/mesh/main.F90 @@ -0,0 +1,84 @@ +PROGRAM main +USE Gmsh_Class +USE GlobalData +USE MSHFile_Class +USE HDF5File_Class +USE Display_Method + +TYPE(Gmsh_) :: gmsh + +CHARACTER(LEN=*), PARAMETER :: prefix = "square" +REAL(DFP), PARAMETER :: lx = 1.0_DFP +REAL(DFP), PARAMETER :: ly = 1.0_DFP +INTEGER(I4B), PARAMETER :: order = 1 + +REAL(DFP), PARAMETER :: meshSize = 1.0 +REAL(DFP), PARAMETER :: corner(3) = 0.0_DFP +INTEGER(I4B), PARAMETER :: nnod(2) = [3, 3] +INTEGER(I4B) :: ierr +REAL(DFP) :: x, y, z, lc +CHARACTER(:), ALLOCATABLE :: suffix, title + +TYPE(MSHFile_) :: mshFile +TYPE(HDF5File_) :: hdf5file + +suffix = ToString(nnod(1))//"x"//ToString(nnod(2)) + +title = prefix//"_"//suffix + +ierr = gmsh%Initialize() +ierr = gmsh%model%add(title) + +x = corner(1); y = corner(2); z = corner(3); lc = meshSize +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=1) + +x = x + lx; y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=2) + +x = x; y = y + ly; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=3) + +x = corner(1); y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=4) + +ierr = gmsh%model%geo%addLine(1, 2, 1) +ierr = gmsh%model%geo%addLine(2, 3, 2) +ierr = gmsh%model%geo%addLine(3, 4, 3) +ierr = gmsh%model%geo%addLine(4, 1, 4) + +ierr = gmsh%model%geo%addCurveLoop([1, 2, 3, 4], tag=1) + +ierr = gmsh%model%geo%addPlaneSurface([1], 1) + +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(1, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(3, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(2, nnod(2), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(4, nnod(2), & + "Progression", 1.0_DFP) + +ierr = gmsh%model%geo%mesh%setTransfiniteSurface(1) +ierr = gmsh%model%geo%mesh%setRecombine(2, 1) + +ierr = gmsh%model%geo%synchronize() + +ierr = gmsh%model%mesh%generate(2) + +ierr = gmsh%model%mesh%setOrder(order) + +ierr = gmsh%WRITE(title//'.msh') + +ierr = gmsh%Finalize() + +CALL mshFile%Initiate(filename=title//'.msh', STATUS="OLD", ACTION="READ") +CALL mshFile%OPEN() +CALL mshFile%READ() +CALL hdf5file%Initiate(title//'.h5', MODE="NEW") +CALL hdf5file%OPEN() +CALL mshFile%Export(hdf5=hdf5file, group="") +CALL mshFile%DEALLOCATE() +CALL hdf5file%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/MatrixFieldLis/examples/mesh/runner.toml b/docs/docs-api/MatrixFieldLis/examples/mesh/runner.toml new file mode 100644 index 00000000..3d324f66 --- /dev/null +++ b/docs/docs-api/MatrixFieldLis/examples/mesh/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/MeshField/mesh/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/MatrixFieldLis/examples/runner.toml b/docs/docs-api/MatrixFieldLis/examples/runner.toml new file mode 100644 index 00000000..38200006 --- /dev/null +++ b/docs/docs-api/MatrixFieldLis/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-test/MatrixFieldLis/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/MeshField/Add.md b/docs/docs-api/MeshField/Add.md new file mode 100644 index 00000000..36a12e82 --- /dev/null +++ b/docs/docs-api/MeshField/Add.md @@ -0,0 +1,7 @@ +# Add + +Inheritated from [AbstractMeshField](/docs-api/AbstractMeshField). + +import EXAMPLE5 from "../AbstractMeshField/Add.md"; + + diff --git a/docs/docs-api/MeshField/CheckEssentialParam.md b/docs/docs-api/MeshField/CheckEssentialParam.md new file mode 100644 index 00000000..39217989 --- /dev/null +++ b/docs/docs-api/MeshField/CheckEssentialParam.md @@ -0,0 +1,7 @@ +# CheckEssentialParam + +Inheritated from [AbstractMeshField](/docs-api/AbstractMeshField). + +import EXAMPLE5 from "../AbstractMeshField/CheckEssentialParam.md"; + + diff --git a/docs/docs-api/MeshField/Deallocate.md b/docs/docs-api/MeshField/Deallocate.md new file mode 100644 index 00000000..31d86923 --- /dev/null +++ b/docs/docs-api/MeshField/Deallocate.md @@ -0,0 +1,7 @@ +# Deallocate + +Inheritated from [AbstractMeshField](/docs-api/AbstractMeshField). + +import EXAMPLE5 from "../AbstractMeshField/Deallocate.md"; + + diff --git a/docs/docs-api/MeshField/Display.md b/docs/docs-api/MeshField/Display.md new file mode 100644 index 00000000..dec00c71 --- /dev/null +++ b/docs/docs-api/MeshField/Display.md @@ -0,0 +1,7 @@ +# Display + +Inheritated from [AbstractMeshField](/docs-api/AbstractMeshField). + +import EXAMPLE5 from "../AbstractMeshField/Display.md"; + + diff --git a/docs/docs-api/MeshField/Export.md b/docs/docs-api/MeshField/Export.md new file mode 100644 index 00000000..2fb60920 --- /dev/null +++ b/docs/docs-api/MeshField/Export.md @@ -0,0 +1,7 @@ +# Export + +Inheritated from [AbstractMeshField](/docs-api/AbstractMeshField). + +import EXAMPLE5 from "../AbstractMeshField/Export.md"; + + diff --git a/docs/docs-api/MeshField/Get.md b/docs/docs-api/MeshField/Get.md new file mode 100644 index 00000000..20b9a99d --- /dev/null +++ b/docs/docs-api/MeshField/Get.md @@ -0,0 +1,7 @@ +# Get + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE500 from "../AbstractMeshField/Get.md"; + + diff --git a/docs/docs-api/MeshField/GetPointer.md b/docs/docs-api/MeshField/GetPointer.md new file mode 100644 index 00000000..dea8d184 --- /dev/null +++ b/docs/docs-api/MeshField/GetPointer.md @@ -0,0 +1,7 @@ +# GetPointer + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE500 from "../AbstractMeshField/GetPointer.md"; + + diff --git a/docs/docs-api/MeshField/GetPrefix.md b/docs/docs-api/MeshField/GetPrefix.md new file mode 100644 index 00000000..44ac9441 --- /dev/null +++ b/docs/docs-api/MeshField/GetPrefix.md @@ -0,0 +1,7 @@ +# GetPrefix + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE500 from "../AbstractMeshField/GetPrefix.md"; + + diff --git a/docs/docs-api/MeshField/Import.md b/docs/docs-api/MeshField/Import.md new file mode 100644 index 00000000..ca181265 --- /dev/null +++ b/docs/docs-api/MeshField/Import.md @@ -0,0 +1,7 @@ +# Import + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE500 from "../AbstractMeshField/Import.md"; + + diff --git a/docs/docs-api/MeshField/Initiate.md b/docs/docs-api/MeshField/Initiate.md new file mode 100644 index 00000000..f666f027 --- /dev/null +++ b/docs/docs-api/MeshField/Initiate.md @@ -0,0 +1,96 @@ +--- +sidebar_position: 4 +--- + +# Initiate + + + +Initiate an instance of `ScalarMeshField_`. + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE300 from "../AbstractMeshField/Initiate.md"; + + + +- 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 + +import EXAMPLE1 from "./examples/_Initiate_test_1.md"; + +
+Click here to see the example +
+ + + +
+
+ +## Example 2 + +import EXAMPLE2 from "./examples/_Initiate_test_2.md"; + +
+Click here to see the example +
+ + + +
+
+ +## Example 3 + +import EXAMPLE3 from "./examples/_Initiate_test_3.md"; + +
+Click here to see the example +
+ + + +
+
+ +## Example 4 + +import EXAMPLE4 from "./examples/_Initiate_test_4.md"; + +
+Click here to see the example +
+ + + +
+
+ +## Example 6 + +import EXAMPLE6 from "./examples/_Initiate_test_6.md"; + +
+Click here to see the example +
+ + + +
+
+ +## Example 7 + +import EXAMPLE7 from "./examples/_Initiate_test_7.md"; + +
+Click here to see the example +
+ + + +
+
diff --git a/docs/docs-api/MeshField/MeshField_.md b/docs/docs-api/MeshField/MeshField_.md new file mode 100644 index 00000000..9bf9c777 --- /dev/null +++ b/docs/docs-api/MeshField/MeshField_.md @@ -0,0 +1,12 @@ +--- +sidebar_position: 2 +--- + +# Structure + +`ScalarMeshField_` is an subclass of `AbstractMeshField_`. + +```fortran +TYPE, EXTENDS(AbstractMeshField_) :: ScalarMeshField_ +END TYPE ScalarMeshField_ +``` diff --git a/docs/docs-api/MeshField/Set.md b/docs/docs-api/MeshField/Set.md new file mode 100644 index 00000000..c7f792dd --- /dev/null +++ b/docs/docs-api/MeshField/Set.md @@ -0,0 +1,7 @@ +# Set + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE500 from "../AbstractMeshField/Set.md"; + + diff --git a/docs/docs-api/MeshField/SetScalarMeshFieldParam.md b/docs/docs-api/MeshField/SetScalarMeshFieldParam.md new file mode 100644 index 00000000..296c9e57 --- /dev/null +++ b/docs/docs-api/MeshField/SetScalarMeshFieldParam.md @@ -0,0 +1,39 @@ +--- +sidebar_position: 3 +--- + +# SetScalarMeshFieldParam + +Set parameters for initiating an instance of `ScalarMeshField`. + + @ConstructorMethods + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE SetScalarMeshFieldParam(param, name, fieldType, varType, & + & engine, defineOn, nns) + TYPE(ParameterList_), INTENT(INOUT) :: param + CHARACTER(*), INTENT(IN) :: name + INTEGER(I4B), INTENT(IN) :: fieldType + INTEGER(I4B), INTENT(IN) :: varType + CHARACTER(*), INTENT(IN) :: engine + INTEGER(I4B), INTENT(IN) :: defineOn + !! Nodal, Quadrature + INTEGER(I4B), INTENT(IN) :: nns + !! Number of node in space + END SUBROUTINE SetScalarMeshFieldParam +END INTERFACE +``` + +Read more about the arguments [here](/docs-api/AbstractMeshField/AbstractMeshField_). + +:::info `varType` +`varType` can take following values: + +- `Constant` +- `Scalar`, in this case `nns` denotes the number of nodes in `space` in an element. +- `Time`, in this case `nnt` denotes the number of nodes in `time` in an element. + +::: diff --git a/docs/docs-api/MeshField/Shape.md b/docs/docs-api/MeshField/Shape.md new file mode 100644 index 00000000..485bff21 --- /dev/null +++ b/docs/docs-api/MeshField/Shape.md @@ -0,0 +1,7 @@ +# Shape + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE500 from "../AbstractMeshField/Shape.md"; + + diff --git a/docs/docs-api/MeshField/Size.md b/docs/docs-api/MeshField/Size.md new file mode 100644 index 00000000..2be07353 --- /dev/null +++ b/docs/docs-api/MeshField/Size.md @@ -0,0 +1,7 @@ +# Size + +Inherited from [AbstractMeshField](/docs-api/AbstractMeshField) + +import EXAMPLE500 from "../AbstractMeshField/Size.md"; + + diff --git a/docs/docs-api/MeshField/examples/InitiateInterpolationPoints1.toml b/docs/docs-api/MeshField/examples/InitiateInterpolationPoints1.toml new file mode 100644 index 00000000..10d64c43 --- /dev/null +++ b/docs/docs-api/MeshField/examples/InitiateInterpolationPoints1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/MeshField/examples/InitiateInterpolationPoints_test_1.vtp b/docs/docs-api/MeshField/examples/InitiateInterpolationPoints_test_1.vtp new file mode 100644 index 00000000..5ee50f5f --- /dev/null +++ b/docs/docs-api/MeshField/examples/InitiateInterpolationPoints_test_1.vtp @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +_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 + + + diff --git a/docs/docs-api/MeshField/examples/WriteData1.toml b/docs/docs-api/MeshField/examples/WriteData1.toml new file mode 100644 index 00000000..10d64c43 --- /dev/null +++ b/docs/docs-api/MeshField/examples/WriteData1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/MeshField/examples/WriteData1.vtp b/docs/docs-api/MeshField/examples/WriteData1.vtp new file mode 100644 index 00000000..5ee50f5f --- /dev/null +++ b/docs/docs-api/MeshField/examples/WriteData1.vtp @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +_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 + + + diff --git a/docs/docs-api/MeshField/examples/_Get_test_1.md b/docs/docs-api/MeshField/examples/_Get_test_1.md new file mode 100644 index 00000000..b05c9301 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Get_test_1.md @@ -0,0 +1,75 @@ +We test `Set` method to construct an instance of [ScalarMeshField_](ScalarMeshField_). In this case the mesh field variable is supposed to vary with the space. + +The mesh is given below + +![](./figures/mesh.png) + +```fortran +PROGRAM main + USE easifemBase + USE easifemClasses + IMPLICIT NONE + TYPE( HDF5File_ ) :: meshfile + TYPE( Mesh_ ) :: amesh + TYPE( ScalarMeshField_ ) :: obj + TYPE( ParameterList_ ) :: param + TYPE( FEVariable_ ) :: fevar + INTEGER( I4B ), PARAMETER :: nns = 6 + REAL( DFP ) :: val( nns ) + INTEGER( I4B ) :: iel +``` + +Initiate and open the mesh file which is in [HDF5File_](../HDF5File/HDF5File_.md) format. + +```fortran +CALL meshfile%Initiate( FileName="./mesh.h5", MODE="READ" ) +CALL meshfile%Open() +CALL amesh%Initiate(hdf5=meshfile, group="/surfaceEntities_1" ) +``` + +Initiate an instance of [ScalarMeshField_](ScalarMeshField_) + +```fortran +CALL FPL_INIT(); CALL param%initiate() +CALL setScalarMeshFieldParam( & + & param=param, & + & name='aScalar', & + & fieldType=FIELD_TYPE_NORMAL, & + & engine='NATIVE_SERIAL', & + & defineOn=Quadrature, & + & nns=nns) +CALL obj%Initiate( param=param, mesh=amesh ) +``` + +To set the entries inside an instance of [ScalarMeshField_](ScalarMeshField_), first one must create an instance of [FEVariable_](../FEVariable/FEVariable_.md). Then one can pass this FEVariable to the instance of [ScalarMeshField_](ScalarMeshField_). Also note that we use `globalElement` number. + +```fortran +DO iel = amesh%minElemNum, amesh%maxElemNum + IF( .NOT. amesh%isElementPresent( iel ) ) CYCLE + CALL RANDOM_NUMBER( val ) + fevar = QuadratureVariable( val, TypeFEVariableScalar, & + & TypeFEVariableSpace ) + CALL obj%set( globalElement=iel, fevar=fevar ) +END DO +``` + +We can get the entries inside an instance of [ScalarMeshField_](ScalarMeshField_) only as an instance of [FEVariable_](../FEVariable/FEVariable_.md). Also note that we use `globalElement` number. + +```fortran +DO iel = amesh%minElemNum, amesh%maxElemNum + IF( .NOT. amesh%isElementPresent( iel ) ) CYCLE + CALL obj%get( globalElement=iel, fevar=fevar ) + CALL Display( fevar, "fevar : " ) +END DO +``` + +cleaning up. + +```fortran + CALL obj%Deallocate() + CALL amesh%Deallocate() + CALL meshfile%Close() + CALL meshfile%Deallocate() + CALL param%Deallocate(); CALL FPL_FINALIZE() +END PROGRAM main +``` diff --git a/docs/docs-api/MeshField/examples/_Get_test_2.md b/docs/docs-api/MeshField/examples/_Get_test_2.md new file mode 100644 index 00000000..bbfec819 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Get_test_2.md @@ -0,0 +1,73 @@ +We test `Set` method to construct an instance of ScalarMeshField_ + +In this case the mesh field variable is constant in space. + +The mesh is given below + +![](./figures/mesh.png) + +```fortran +PROGRAM main + USE easifemBase + USE easifemClasses + IMPLICIT NONE + TYPE( HDF5File_ ) :: meshfile + TYPE( Mesh_ ) :: amesh + TYPE( ScalarMeshField_ ) :: obj + TYPE( ParameterList_ ) :: param + TYPE( FEVariable_ ) :: fevar + INTEGER( I4B ), PARAMETER :: nns = 1 + REAL( DFP ) :: val( nns ) + INTEGER( I4B ) :: iel +``` + +Initiate and open the mesh file which is in [HDF5File_](../HDF5File/HDF5File_.md) format. + +```fortran +CALL meshfile%Initiate( FileName="./mesh.h5", MODE="READ" ) +CALL meshfile%Open() +CALL amesh%Initiate(hdf5=meshfile, group="/surfaceEntities_1" ) +``` + +Initiate an instance of ScalarMeshField_. + +```fortran +CALL FPL_INIT(); CALL param%initiate() +CALL setScalarMeshFieldParam( & + & param=param, & + & name='aScalar', & + & fieldType=FIELD_TYPE_CONSTANT, & + & engine='NATIVE_SERIAL', & + & defineOn=Quadrature, & + & nns=nns) +CALL obj%Initiate( param=param, mesh=amesh ) +``` + +To set the entries inside an instance of ScalarMeshField_, first one must create an instance of [FEVariable_](../FEVariable/FEVariable_.md). Then one can pass this FEVariable to the instance of ScalarMeshField_. Also note that we use `globalElement` number. + +Because our Scalar mesh field is a constant in this example, we do not need to set the value for each element. Also note that if the mesh field was not constant, then the below code implies we are settings the values for each element to the same value. It is like all components of a vector have same value. + +```fortran +CALL RANDOM_NUMBER( val ) +fevar = QuadratureVariable( val, TypeFEVariableScalar, & + & TypeFEVariableSpace ) +CALL obj%set( fevar=fevar ) +``` + +We can get the entries inside an instance of ScalarMeshField_ only as an instance of [FEVariable_](../FEVariable/FEVariable_.md). Also note that we use `globalElement` number. + +```fortran +CALL obj%get( fevar=fevar ) +CALL Display( fevar, "fevar : " ) +``` + +cleaning up. + +```fortran + CALL obj%Deallocate() + CALL amesh%Deallocate() + CALL meshfile%Close() + CALL meshfile%Deallocate() + CALL param%Deallocate(); CALL FPL_FINALIZE() +END PROGRAM main +``` diff --git a/docs/docs-api/MeshField/examples/_InitiateInterpolationPoints_test_1.F90 b/docs/docs-api/MeshField/examples/_InitiateInterpolationPoints_test_1.F90 new file mode 100644 index 00000000..deb6c707 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_InitiateInterpolationPoints_test_1.F90 @@ -0,0 +1,66 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-27 +! summary: In this test we will construct Vector MeshField of +! interpolation points and write these data to a VTK file. +! The implementation is similar to the +! InitiateInterpolationPoints + +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 EngineOpt_Class, ONLY: TypeEngineOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE FEVariable_Method, ONLY: NodalVariable, & + FEVariable_Set => Set +USE BaseType, ONLY: TypeFEVariableOpt, & + FEVariable_, & + TypeFEVariableVector, & + TypeFEVariableSpace, & + TypeInterpolationOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + tomlFileName = "./InitiateInterpolationPoints1.toml", & + engine = TypeEngineOpt%native_serial, & + myName = "main", & + modName = "_InitiateInterpolationPoints_test_1.F90" + +INTEGER(I4B), PARAMETER :: & + nsd = 3, varType = TypeFEVariableOpt%Space, & + fieldType = TypeFieldOpt%normal, & + defineOn = TypeFieldOpt%nodal, & + order(3) = 9, & + ipType(3) = TypeInterpolationOpt%Equidistance + +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(MeshField_) :: obj +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() +CALL InitiateInterpolationPoints(obj=obj, order=order, ipType=ipType, & + fedof=fedof, mesh=mesh, engine=engine) + +CALL obj%WriteData(filename="InitiateInterpolationPoints_test_1.vtp", & + nodeCoordField=obj) + +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_1.F90 b/docs/docs-api/MeshField/examples/_Initiate_test_1.F90 new file mode 100644 index 00000000..59c568e4 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_1.F90 @@ -0,0 +1,97 @@ +!> 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 diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_1.md b/docs/docs-api/MeshField/examples/_Initiate_test_1.md new file mode 100644 index 00000000..750dbae5 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_1.md @@ -0,0 +1,37 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_1.F90'; + +{CodeSnippet} + +Mesh info: + +```txt +total nodes: 12 +total elements: 14 +``` + +The above code will initiate an instance of `ScalarMeshField_`, which will contain following data. + +```txt +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. diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_2.F90 b/docs/docs-api/MeshField/examples/_Initiate_test_2.F90 new file mode 100644 index 00000000..41910378 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_2.F90 @@ -0,0 +1,39 @@ +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 diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_2.md b/docs/docs-api/MeshField/examples/_Initiate_test_2.md new file mode 100644 index 00000000..0b492e99 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_2.md @@ -0,0 +1,70 @@ + + +- `fieldType` = constant +- `varType` = constant + +```fortran +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. + +```txt +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`. diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_3.F90 b/docs/docs-api/MeshField/examples/_Initiate_test_3.F90 new file mode 100644 index 00000000..78ff4556 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_3.F90 @@ -0,0 +1,41 @@ +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 diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_3.md b/docs/docs-api/MeshField/examples/_Initiate_test_3.md new file mode 100644 index 00000000..e0fd0eb6 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_3.md @@ -0,0 +1,70 @@ + + +```fortran +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 +``` + +```bash title="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` diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_4.F90 b/docs/docs-api/MeshField/examples/_Initiate_test_4.F90 new file mode 100644 index 00000000..197a401e --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_4.F90 @@ -0,0 +1,41 @@ +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 diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_4.md b/docs/docs-api/MeshField/examples/_Initiate_test_4.md new file mode 100644 index 00000000..7749155e --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_4.md @@ -0,0 +1,65 @@ + + +```fortran +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 +``` + +```bash title="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 +``` diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_6.F90 b/docs/docs-api/MeshField/examples/_Initiate_test_6.F90 new file mode 100644 index 00000000..6640dda2 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_6.F90 @@ -0,0 +1,41 @@ +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 diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_6.md b/docs/docs-api/MeshField/examples/_Initiate_test_6.md new file mode 100644 index 00000000..384b065c --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_6.md @@ -0,0 +1,50 @@ + + +:::info +Initiate an instance of `ScalarMeshField_` by using a `UserFunction_`. The user function is constant in this example. + +::: + +```fortran +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 +``` diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_7.F90 b/docs/docs-api/MeshField/examples/_Initiate_test_7.F90 new file mode 100644 index 00000000..e742761c --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_7.F90 @@ -0,0 +1,41 @@ +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 diff --git a/docs/docs-api/MeshField/examples/_Initiate_test_7.md b/docs/docs-api/MeshField/examples/_Initiate_test_7.md new file mode 100644 index 00000000..f2fbeb2c --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Initiate_test_7.md @@ -0,0 +1,49 @@ + + +:::info +This example shows how to initiate an instance of `ScalarMeshField_` by using a `UserFunction`. The user function is space dependent in this example. +::: + +```fortran +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 +``` diff --git a/docs/docs-api/MeshField/examples/_Insert_test_1.F90 b/docs/docs-api/MeshField/examples/_Insert_test_1.F90 new file mode 100644 index 00000000..cd64a778 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Insert_test_1.F90 @@ -0,0 +1,77 @@ +! We test `Set` method to construct an instance of ScalarField_. +! In this case the mesh field variable is supposed to vary with the space. + +PROGRAM main +USE Test_Method +USE HDF5File_Class +USE FEMesh_Class +USE AbstractField_Class +USE ScalarMeshField_Class +USE FPL +USE GlobalData +USE BaseType, ONLY: FEVariable_, & + TypeFEVariableScalar, & + TypeFEVariableSpace +USE FEVariable_Method +USE Display_Method + +IMPLICIT NONE + +INTEGER(I4B), PARAMETER :: nns = 6 +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 +INTEGER(I4B), PARAMETER :: defineOn = Quadrature +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" + +TYPE(HDF5File_) :: meshfile +TYPE(FEMesh_) :: amesh +TYPE(ScalarMeshField_) :: obj +TYPE(ParameterList_) :: param +TYPE(FEVariable_) :: fevar, want, found +REAL(DFP) :: val(nns) +INTEGER(I4B) :: iel, tcells +LOGICAL(LGT) :: isok + +CALL meshfile%Initiate(fileName=filename, MODE="READ") +CALL meshfile%OPEN() +CALL amesh%Initiate(hdf5=meshfile, dim=nsd) + +CALL FPL_INIT(); CALL param%initiate() + +CALL SetScalarMeshFieldParam(param=param, name='aScalar', fieldType=fieldType, & + engine=engine, defineOn=defineOn, nns=nns, varType=varType) + +CALL obj%Initiate(param=param, mesh=amesh) + +! To set the entries inside an instance of [ScalarMeshField_](ScalarMeshField_), +! first one must create an instance of [FEVariable_](../FEVariable/FEVariable_.md). +! Then one can pass this FEVariable to the instance of [ScalarMeshField_](ScalarMeshField_). +! Also note that we use `globalElement` number. + +tcells = amesh%GetTotalCells() + +DO iel = 1, tcells + CALL RANDOM_NUMBER(val) + fevar = QuadratureVariable(val, TypeFEVariableScalar, & + TypeFEVariableSpace) + CALL obj%Insert(globalElement=iel, fevar=fevar, islocal=.TRUE.) + CALL obj%Get(globalElement=iel, fevar=found, islocal=.TRUE.) + want = fevar + isok = found .EQ. want + IF (.NOT. isok) THEN + CALL Display(found, "found") + CALL Display(want, "want") + EXIT + END IF +END DO + +CALL OK(isok, 'Insert') + +CALL obj%DEALLOCATE() +CALL amesh%DEALLOCATE() +CALL meshfile%CLOSE() +CALL meshfile%DEALLOCATE() +CALL param%DEALLOCATE(); CALL FPL_FINALIZE() +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/_Set_test_1.F90 b/docs/docs-api/MeshField/examples/_Set_test_1.F90 new file mode 100644 index 00000000..15f04e5c --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Set_test_1.F90 @@ -0,0 +1,78 @@ +! We test `Set` method to construct an instance of ScalarField_. +! In this case the mesh field variable is supposed to vary with the space. + +PROGRAM main +USE Test_Method +USE HDF5File_Class +USE FEMesh_Class +USE AbstractField_Class +USE ScalarMeshField_Class +USE FPL +USE GlobalData +USE BaseType, ONLY: FEVariable_, & + TypeFEVariableScalar, & + TypeFEVariableSpace +USE FEVariable_Method +USE Display_Method + +IMPLICIT NONE + +INTEGER(I4B), PARAMETER :: nns = 6 +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 +INTEGER(I4B), PARAMETER :: defineOn = Quadrature +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" + +TYPE(HDF5File_) :: meshfile +TYPE(FEMesh_) :: amesh +TYPE(ScalarMeshField_) :: obj +TYPE(ParameterList_) :: param +TYPE(FEVariable_) :: fevar, want, found +REAL(DFP) :: val(nns) +INTEGER(I4B) :: iel, tcells +LOGICAL(LGT) :: isok + +CALL meshfile%Initiate(fileName=filename, MODE="READ") +CALL meshfile%OPEN() +CALL amesh%Initiate(hdf5=meshfile, dim=nsd) + +CALL FPL_INIT(); CALL param%initiate() + +CALL SetScalarMeshFieldParam(param=param, name='aScalar', fieldType=fieldType, & + engine=engine, defineOn=defineOn, nns=nns, varType=varType) + +CALL obj%Initiate(param=param, mesh=amesh) + +! To set the entries inside an instance of [ScalarMeshField_](ScalarMeshField_), +! first one must create an instance of [FEVariable_](../FEVariable/FEVariable_.md). +! Then one can pass this FEVariable to the instance of [ScalarMeshField_](ScalarMeshField_). +! Also note that we use `globalElement` number. + +tcells = amesh%GetTotalCells() + +DO iel = 1, tcells + CALL RANDOM_NUMBER(val) + fevar = QuadratureVariable(val, TypeFEVariableScalar, & + TypeFEVariableSpace) + CALL obj%Insert(globalElement=iel, fevar=fevar, islocal=.TRUE.) + CALL obj%Set(globalElement=iel, fevar=fevar, islocal=.TRUE.) + CALL obj%Get(globalElement=iel, fevar=found, islocal=.TRUE.) + want = fevar + isok = found .EQ. want + IF (.NOT. isok) THEN + CALL Display(found, "found") + CALL Display(want, "want") + EXIT + END IF +END DO + +CALL OK(isok, 'Set') + +CALL obj%DEALLOCATE() +CALL amesh%DEALLOCATE() +CALL meshfile%CLOSE() +CALL meshfile%DEALLOCATE() +CALL param%DEALLOCATE(); CALL FPL_FINALIZE() +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/_Set_test_1.md b/docs/docs-api/MeshField/examples/_Set_test_1.md new file mode 100644 index 00000000..e2463ac8 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Set_test_1.md @@ -0,0 +1,78 @@ + + +```fortran +PROGRAM main +USE Test_Method +USE HDF5File_Class +USE FEMesh_Class +USE AbstractField_Class +USE ScalarMeshField_Class +USE FPL +USE GlobalData +USE BaseType, ONLY: FEVariable_, & + TypeFEVariableScalar, & + TypeFEVariableSpace +USE FEVariable_Method +USE Display_Method + +IMPLICIT NONE + +INTEGER(I4B), PARAMETER :: nns = 6 +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 +INTEGER(I4B), PARAMETER :: defineOn = Quadrature +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" + +TYPE(HDF5File_) :: meshfile +TYPE(FEMesh_) :: amesh +TYPE(ScalarMeshField_) :: obj +TYPE(ParameterList_) :: param +TYPE(FEVariable_) :: fevar, want, found +REAL(DFP) :: val(nns) +INTEGER(I4B) :: iel, tcells +LOGICAL(LGT) :: isok + +CALL meshfile%Initiate(fileName=filename, MODE="READ") +CALL meshfile%OPEN() +CALL amesh%Initiate(hdf5=meshfile, dim=nsd) + +CALL FPL_INIT(); CALL param%initiate() + +CALL SetScalarMeshFieldParam(param=param, name='aScalar', fieldType=fieldType, & + engine=engine, defineOn=defineOn, nns=nns, varType=varType) + +CALL obj%Initiate(param=param, mesh=amesh) + +! To set the entries inside an instance of [ScalarMeshField_](ScalarMeshField_), +! first one must create an instance of [FEVariable_](../FEVariable/FEVariable_.md). +! Then one can pass this FEVariable to the instance of [ScalarMeshField_](ScalarMeshField_). +! Also note that we use `globalElement` number. + +tcells = amesh%GetTotalCells() + +DO iel = 1, tcells + CALL RANDOM_NUMBER(val) + fevar = QuadratureVariable(val, TypeFEVariableScalar, & + TypeFEVariableSpace) + CALL obj%Set(globalElement=iel, fevar=fevar, islocal=.TRUE.) + CALL obj%Get(globalElement=iel, fevar=found, islocal=.TRUE.) + want = fevar + isok = found .EQ. want + IF (.NOT. isok) THEN + CALL Display(found, "found") + CALL Display(want, "want") + EXIT + END IF +END DO + +CALL OK(isok, 'Set') + +CALL obj%DEALLOCATE() +CALL amesh%DEALLOCATE() +CALL meshfile%CLOSE() +CALL meshfile%DEALLOCATE() +CALL param%DEALLOCATE(); CALL FPL_FINALIZE() +END PROGRAM main +``` diff --git a/docs/docs-api/MeshField/examples/_Set_test_2.F90 b/docs/docs-api/MeshField/examples/_Set_test_2.F90 new file mode 100644 index 00000000..fae69215 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Set_test_2.F90 @@ -0,0 +1,84 @@ +PROGRAM main +USE Test_Method +USE HDF5File_Class +USE FEMesh_Class +USE AbstractField_Class +USE ScalarMeshField_Class +USE FPL +USE GlobalData +USE BaseType, ONLY: FEVariable_, & + TypeFEVariableScalar, & + TypeFEVariableSpace +USE FEVariable_Method +USE Display_Method + +IMPLICIT NONE + +INTEGER(I4B), PARAMETER :: nns = 6 +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 +INTEGER(I4B), PARAMETER :: defineOn = Quadrature +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" + +TYPE(HDF5File_) :: meshfile +TYPE(FEMesh_) :: amesh +TYPE(ScalarMeshField_) :: obj +TYPE(ParameterList_) :: param +TYPE(FEVariable_) :: fevar, want, found +REAL(DFP) :: val(nns) +INTEGER(I4B) :: iel, tcells, aint +LOGICAL(LGT) :: isok + +CALL meshfile%Initiate(fileName=filename, MODE="READ") +CALL meshfile%OPEN() +CALL amesh%Initiate(hdf5=meshfile, dim=nsd) + +CALL FPL_INIT(); CALL param%initiate() + +CALL SetScalarMeshFieldParam(param=param, name='aScalar', fieldType=fieldType, & + engine=engine, defineOn=defineOn, nns=nns, varType=varType) + +CALL obj%Initiate(param=param, mesh=amesh) + +! To set the entries inside an instance of ScalarMeshField_ +! first one must create an instance ofFEVariable_ +! Then one can pass this FEVariable to the instance of ScalarMeshField_ +! Also note that we use `globalElement` number. + +tcells = amesh%GetTotalCells() + +DO iel = 1, tcells + CALL RANDOM_NUMBER(val) + + IF (MOD(iel, 2) == 0) THEN + aint = nns / 2 + ELSE + aint = nns + END IF + + fevar = QuadratureVariable(val(1:aint), TypeFEVariableScalar, & + TypeFEVariableSpace) + CALL obj%Insert(globalElement=iel, fevar=fevar, islocal=.TRUE.) + CALL obj%Set(globalElement=iel, fevar=fevar, islocal=.TRUE.) + CALL obj%Get(globalElement=iel, fevar=found, islocal=.TRUE.) + + want = fevar + isok = found .EQ. want + IF (.NOT. isok) THEN + CALL Display(found, "found (iel = "//tostring(iel)//"): ") + CALL BlankLines(nol=1) + CALL Display(want, "want (iel = "//tostring(iel)//"): ") + EXIT + END IF +END DO + +CALL OK(isok, 'Set') + +CALL obj%DEALLOCATE() +CALL amesh%DEALLOCATE() +CALL meshfile%CLOSE() +CALL meshfile%DEALLOCATE() +CALL param%DEALLOCATE(); CALL FPL_FINALIZE() +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/_Set_test_2.md b/docs/docs-api/MeshField/examples/_Set_test_2.md new file mode 100644 index 00000000..bbfec819 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Set_test_2.md @@ -0,0 +1,73 @@ +We test `Set` method to construct an instance of ScalarMeshField_ + +In this case the mesh field variable is constant in space. + +The mesh is given below + +![](./figures/mesh.png) + +```fortran +PROGRAM main + USE easifemBase + USE easifemClasses + IMPLICIT NONE + TYPE( HDF5File_ ) :: meshfile + TYPE( Mesh_ ) :: amesh + TYPE( ScalarMeshField_ ) :: obj + TYPE( ParameterList_ ) :: param + TYPE( FEVariable_ ) :: fevar + INTEGER( I4B ), PARAMETER :: nns = 1 + REAL( DFP ) :: val( nns ) + INTEGER( I4B ) :: iel +``` + +Initiate and open the mesh file which is in [HDF5File_](../HDF5File/HDF5File_.md) format. + +```fortran +CALL meshfile%Initiate( FileName="./mesh.h5", MODE="READ" ) +CALL meshfile%Open() +CALL amesh%Initiate(hdf5=meshfile, group="/surfaceEntities_1" ) +``` + +Initiate an instance of ScalarMeshField_. + +```fortran +CALL FPL_INIT(); CALL param%initiate() +CALL setScalarMeshFieldParam( & + & param=param, & + & name='aScalar', & + & fieldType=FIELD_TYPE_CONSTANT, & + & engine='NATIVE_SERIAL', & + & defineOn=Quadrature, & + & nns=nns) +CALL obj%Initiate( param=param, mesh=amesh ) +``` + +To set the entries inside an instance of ScalarMeshField_, first one must create an instance of [FEVariable_](../FEVariable/FEVariable_.md). Then one can pass this FEVariable to the instance of ScalarMeshField_. Also note that we use `globalElement` number. + +Because our Scalar mesh field is a constant in this example, we do not need to set the value for each element. Also note that if the mesh field was not constant, then the below code implies we are settings the values for each element to the same value. It is like all components of a vector have same value. + +```fortran +CALL RANDOM_NUMBER( val ) +fevar = QuadratureVariable( val, TypeFEVariableScalar, & + & TypeFEVariableSpace ) +CALL obj%set( fevar=fevar ) +``` + +We can get the entries inside an instance of ScalarMeshField_ only as an instance of [FEVariable_](../FEVariable/FEVariable_.md). Also note that we use `globalElement` number. + +```fortran +CALL obj%get( fevar=fevar ) +CALL Display( fevar, "fevar : " ) +``` + +cleaning up. + +```fortran + CALL obj%Deallocate() + CALL amesh%Deallocate() + CALL meshfile%Close() + CALL meshfile%Deallocate() + CALL param%Deallocate(); CALL FPL_FINALIZE() +END PROGRAM main +``` diff --git a/docs/docs-api/MeshField/examples/_Set_test_3.F90 b/docs/docs-api/MeshField/examples/_Set_test_3.F90 new file mode 100644 index 00000000..35522c1d --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Set_test_3.F90 @@ -0,0 +1,70 @@ +PROGRAM main +USE Test_Method +USE HDF5File_Class +USE FEMesh_Class +USE AbstractField_Class +USE ScalarMeshField_Class +USE FPL +USE GlobalData +USE BaseType +USE FEVariable_Method +USE Display_Method +USE UserFunction_Class + +IMPLICIT NONE + +INTEGER(I4B), PARAMETER :: nns = 6 +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 +INTEGER(I4B), PARAMETER :: defineOn = Quadrature +INTEGER(I4B), PARAMETER :: returnType = Scalar +INTEGER(I4B), PARAMETER :: argType = Constant +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" + +TYPE(HDF5File_) :: meshfile +TYPE(FEMesh_) :: amesh +TYPE(ScalarMeshField_) :: obj +TYPE(ParameterList_) :: param +TYPE(UserFunction_) :: func +PROCEDURE(iface_scalarFunction), POINTER :: func1 => NULL() +TYPE(FEVariable_) :: found, want +INTEGER(I4B) :: iel, tcells +LOGICAL(LGT) :: isok + +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=engine) + +CALL obj%Insert(func=func) + +tcells = amesh%GetTotalCells() + +DO iel = 1, tcells + CALL obj%Get(globalElement=iel, fevar=found, islocal=.TRUE.) + want = NodalVariable(2.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + + isok = found .EQ. want + IF (.NOT. isok) EXIT +END DO + +CALL OK(isok, 'Set') + +CALL obj%DEALLOCATE() +CALL amesh%DEALLOCATE() +CALL meshfile%CLOSE() +CALL meshfile%DEALLOCATE() +CALL param%DEALLOCATE() +CALL FPL_FINALIZE() + +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/_Set_test_4.F90 b/docs/docs-api/MeshField/examples/_Set_test_4.F90 new file mode 100644 index 00000000..3e347d5a --- /dev/null +++ b/docs/docs-api/MeshField/examples/_Set_test_4.F90 @@ -0,0 +1,80 @@ +! This example checks the set method. +! In this example we initiate`ScalarMeshField_`by using user FUNCTION +! In addition, we also set DATA in`ScalarMeshField_`by using user FUNCTION. + +PROGRAM main +USE Test_Method +USE HDF5File_Class +USE FEMesh_Class +USE AbstractField_Class +USE ScalarMeshField_Class +USE FPL +USE GlobalData +USE BaseType +USE FEVariable_Method +USE Display_Method +USE UserFunction_Class + +IMPLICIT NONE + +INTEGER(I4B), PARAMETER :: nns = 6 +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 +INTEGER(I4B), PARAMETER :: defineOn = Quadrature +INTEGER(I4B), PARAMETER :: returnType = Scalar +INTEGER(I4B), PARAMETER :: argType = Constant +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" + +TYPE(HDF5File_) :: meshfile +TYPE(FEMesh_) :: amesh +TYPE(ScalarMeshField_) :: obj +TYPE(ParameterList_) :: param +TYPE(FEVariable_) :: found, want +INTEGER(I4B) :: iel, tcells +LOGICAL(LGT) :: isok +TYPE(UserFunction_) :: func +PROCEDURE(iface_ScalarFunction), POINTER :: func_ptr => NULL() + +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=Scalar, & + argType=Space) +CALL func%Initiate(param) +func_ptr => func1 +CALL func%Set(scalarFunction=func_ptr) + +CALL obj%Initiate(mesh=amesh, func=func, name="func", engine=engine) + +CALL obj%Insert(func=func) + +tcells = amesh%GetTotalCells() + +DO iel = 1, tcells + CALL obj%Get(globalElement=iel, fevar=found, islocal=.TRUE.) + want = NodalVariable(2.0_DFP, TypeFEVariableScalar, TypeFEVariableConstant) + + isok = found .EQ. want + IF (.NOT. isok) EXIT +END DO + +CALL OK(isok, 'Set') + +CALL obj%DEALLOCATE() +CALL amesh%DEALLOCATE() +CALL meshfile%CLOSE() +CALL meshfile%DEALLOCATE() +CALL param%DEALLOCATE(); CALL FPL_FINALIZE() + +CONTAINS +PURE FUNCTION func1(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(2) +END FUNCTION func1 +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/_WriteData_test_1.F90 b/docs/docs-api/MeshField/examples/_WriteData_test_1.F90 new file mode 100644 index 00000000..9daea0d9 --- /dev/null +++ b/docs/docs-api/MeshField/examples/_WriteData_test_1.F90 @@ -0,0 +1,111 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-27 +! summary: In this test we will construct Vector MeshField of +! interpolation points and write these data to a VTK file. +! The implementation is similar to the +! InitiateInterpolationPoints + +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 = "./WriteData1.toml", & + engine = TypeEngineOpt%native_serial, & + myName = "main", & + modName = "_WriteData_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, & + elemCoord_i, elemCoord_j +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) + +elemCoord = 0.0_DFP + +DO iel = 1, tElements + CALL fedof%SetFE(globalElement=iel, islocal=.TRUE.) + + feptr => fedof%GetFEPointer(globalElement=iel, islocal=.TRUE.) + + CALL mesh%GetNodeCoord( & + globalElement=iel, nodeCoord=elemCoord, nrow=elemCoord_i, & + ncol=elemCoord_j, islocal=.TRUE.) + + CALL feptr%GetInterpolationPoints( & + xij=elemCoord, ans=xij, nrow=xij_i, ncol=xij_j, order=order, & + ipType=ipType) + + CALL Display(elemCoord, msg="elemCoord: ") + + 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: ") + +CALL obj%WriteData(fileName="WriteData1.vtp", nodeCoordField=obj) + +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/config.toml b/docs/docs-api/MeshField/examples/config.toml new file mode 100644 index 00000000..10d64c43 --- /dev/null +++ b/docs/docs-api/MeshField/examples/config.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/MeshField/examples/mesh/main.F90 b/docs/docs-api/MeshField/examples/mesh/main.F90 new file mode 100644 index 00000000..cf0cd946 --- /dev/null +++ b/docs/docs-api/MeshField/examples/mesh/main.F90 @@ -0,0 +1,84 @@ +PROGRAM main +USE Gmsh_Class +USE GlobalData +USE MSHFile_Class +USE HDF5File_Class +USE Display_Method + +TYPE(Gmsh_) :: gmsh + +CHARACTER(LEN=*), PARAMETER :: prefix = "square" +REAL(DFP), PARAMETER :: lx = 1.0_DFP +REAL(DFP), PARAMETER :: ly = 1.0_DFP +INTEGER(I4B), PARAMETER :: order = 1 + +REAL(DFP), PARAMETER :: meshSize = 1.0 +REAL(DFP), PARAMETER :: corner(3) = 0.0_DFP +INTEGER(I4B), PARAMETER :: nnod(2) = [3, 3] +INTEGER(I4B) :: ierr +REAL(DFP) :: x, y, z, lc +CHARACTER(:), ALLOCATABLE :: suffix, title + +TYPE(MSHFile_) :: mshFile +TYPE(HDF5File_) :: hdf5file + +suffix = ToString(nnod(1))//"x"//ToString(nnod(2)) + +title = prefix//"_"//suffix + +ierr = gmsh%Initialize() +ierr = gmsh%model%add(title) + +x = corner(1); y = corner(2); z = corner(3); lc = meshSize +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=1) + +x = x + lx; y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=2) + +x = x; y = y + ly; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=3) + +x = corner(1); y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=4) + +ierr = gmsh%model%geo%addLine(1, 2, 1) +ierr = gmsh%model%geo%addLine(2, 3, 2) +ierr = gmsh%model%geo%addLine(3, 4, 3) +ierr = gmsh%model%geo%addLine(4, 1, 4) + +ierr = gmsh%model%geo%addCurveLoop([1, 2, 3, 4], tag=1) + +ierr = gmsh%model%geo%addPlaneSurface([1], 1) + +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(1, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(3, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(2, nnod(2), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(4, nnod(2), & + "Progression", 1.0_DFP) + +ierr = gmsh%model%geo%mesh%setTransfiniteSurface(1) +ierr = gmsh%model%geo%mesh%setRecombine(2, 1) + +ierr = gmsh%model%geo%synchronize() + +ierr = gmsh%model%mesh%generate(2) + +ierr = gmsh%model%mesh%setOrder(order) + +ierr = gmsh%WRITE(title//'.msh') + +ierr = gmsh%Finalize() + +CALL mshFile%Initiate(filename=title//'.msh', STATUS="OLD", ACTION="READ") +CALL mshFile%OPEN() +CALL mshFile%READ() +CALL hdf5file%Initiate(title//'.h5', MODE="NEW") +CALL hdf5file%OPEN() +CALL mshFile%Export(hdf5=hdf5file, group="") +CALL mshFile%DEALLOCATE() +CALL hdf5file%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/MeshField/examples/mesh/runner.toml b/docs/docs-api/MeshField/examples/mesh/runner.toml new file mode 100644 index 00000000..3d324f66 --- /dev/null +++ b/docs/docs-api/MeshField/examples/mesh/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/MeshField/mesh/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/MeshField/examples/runner.toml b/docs/docs-api/MeshField/examples/runner.toml new file mode 100644 index 00000000..ab83a728 --- /dev/null +++ b/docs/docs-api/MeshField/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/MeshField/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/MeshField/index.md b/docs/docs-api/MeshField/index.md new file mode 100644 index 00000000..42967963 --- /dev/null +++ b/docs/docs-api/MeshField/index.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 1 +date: 2023-03-21 +update: 2023-03-21 +status: stable +docs: done +extpkgs: + - lis +category: + - LinearAlgebra + - Fields + - Vectors + - Lis +tags: + - vectors + - fields + - easifemClasses + - lis + - extpkgs +--- + +# MeshField + +`MeshField` is a subclass of [AbstractMeshField](/docs-api/AbstractMeshField). It is used to store variables defined on elements of mesh. We can define the variable either on the nodes of the finite element, or we can define these variables on the quadrature points. + +- By defining `varType` we can control how the scalar field changes inside an element. +- By defining `fieldType`, we can control how the scalar field over the elements of mesh. + +## Getting Started + +This datatype should be used in the following way: + +- Initiate an instance of `ScalarMeshField`. This step will allocate required memory for the scalar field +- Then, set the values in `ScalarMeshField`. This action is performed by using `Set` method. There are several ways to use `Set` method. The first one requires as to pass an instance of `FEVariable`. + +## All Methods + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/docs-api/MeshSelection/GetElemNum.md b/docs/docs-api/MeshSelection/GetElemNum.md index f42069ca..734ae10d 100644 --- a/docs/docs-api/MeshSelection/GetElemNum.md +++ b/docs/docs-api/MeshSelection/GetElemNum.md @@ -2,20 +2,54 @@ This method returns the element numbers stored inside the mesh selection instance. -## Interface +The GetElemNum method retrieves element numbers from a MeshSelection object. There are four different implementations: + +1. **GetElemNum1**: Returns element numbers when isSelectionByElemNum is true for a specific dimension. +2. **GetElemNum2**: Returns element numbers for a specific dimension using both selection by element number and selection by mesh ID. +3. **GetElemNum3**: Returns all element numbers across all dimensions when isSelectionByElemNum is true. +4. **GetElemNum4**: Returns all element numbers across all dimensions using both selection by element number and selection by mesh ID. + +:::note +Basically there are two interfaces one with `AbstractDomain_` and and one without it. When `AbstractDomain_` is not provided then the method will return element numbers when `isSelectionByElemNum` is true. When `AbstractDomain_` is provided then the method will return element numbers when `isSelectionByElemNum` or `isSelectionByMeshID` is true. +::: + +### Dimension Mapping + +- dim = 0: Elements from pointElemNum +- dim = 1: Elements from curveElemNum +- dim = 2: Elements from surfaceElemNum +- dim = 3: Elements from volumeElemNum + +### Selection Methods Used + +- ✅ isSelectionByMeshID (GetElemNum2, GetElemNum4) +- ✅ isSelectionByElemNum (all variants) +- ❌ isSelectionByNodeNum (not implemented) +- ❌ isSelectionByBox (not implemented) + +## Interface1 The following interface returns element number if `isSelectionByElemNum` is true. ```fortran -INTERFACE - MODULE FUNCTION meshSelect_getElemNum1(obj, dim) RESULT(Ans) - CLASS(MeshSelection_), INTENT(IN) :: obj - INTEGER(I4B), INTENT(IN) :: dim - INTEGER(I4B), ALLOCATABLE :: ans(:) - END FUNCTION meshSelect_getElemNum1 -END INTERFACE +MODULE SUBROUTINE GetElemNum1(obj, dim, ans, tsize) + CLASS(MeshSelection_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: dim + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize +END SUBROUTINE GetElemNum1 ``` +Returns element numbers when isSelectionByElemNum is true for a specific dimension. + +- **dim**: Dimension to retrieve elements from (0=point, 1=curve, 2=surface, 3=volume) +- **ans**: Array to store the element numbers +- **tsize**: Number of element numbers retrieved + +Note: This method only works when isSelectionByElemNum is true. + +## Interface2 + The following interface returns element number when - `IsSelectionByElemNum` is true @@ -27,46 +61,54 @@ TODO - `IsSelectionByBox` ```fortran -INTERFACE - MODULE FUNCTION meshSelect_getElemNum2(obj, dim, domain) RESULT(Ans) - CLASS(MeshSelection_), INTENT(IN) :: obj - INTEGER(I4B), INTENT(IN) :: dim - CLASS(Domain_), INTENT(IN) :: domain - INTEGER(I4B), ALLOCATABLE :: ans(:) - END FUNCTION meshSelect_getElemNum2 -END INTERFACE +MODULE SUBROUTINE GetElemNum2(obj, dim, dom, ans, tsize) + CLASS(MeshSelection_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: dim + CLASS(AbstractDomain_), INTENT(IN) :: dom + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize +END SUBROUTINE GetElemNum2 ``` +Returns element numbers for a specific dimension using both selection by element number and selection by mesh ID. + +- **dim**: Dimension to retrieve elements from (0=point, 1=curve, 2=surface, 3=volume) +- **dom**: Abstract domain containing the meshes +- **ans**: Array to store the element numbers +- **tsize**: Number of element numbers retrieved + +## Interface3 + The following interface returns element of all dimensions. ```fortran -INTERFACE - MODULE FUNCTION meshSelect_getElemNum3(obj) RESULT(Ans) - CLASS(MeshSelection_), INTENT(IN) :: obj - INTEGER(I4B), ALLOCATABLE :: ans(:) - END FUNCTION meshSelect_getElemNum3 -END INTERFACE +MODULE SUBROUTINE GetElemNum3(obj, ans, tsize) + CLASS(MeshSelection_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize +END SUBROUTINE GetElemNum3 ``` -```fortran -INTERFACE - MODULE FUNCTION meshSelect_getElemNum4(obj, domain) RESULT(Ans) - CLASS(MeshSelection_), INTENT(IN) :: obj - CLASS(Domain_), INTENT(IN) :: domain - INTEGER(I4B), ALLOCATABLE :: ans(:) - END FUNCTION meshSelect_getElemNum4 -END INTERFACE -``` +Returns all element numbers across all dimensions when isSelectionByElemNum is true, combining elements from pointElemNum, curveElemNum, surfaceElemNum, and volumeElemNum. + +- **ans**: Array to store the element numbers +- **tsize**: Number of element numbers retrieved -## Example 1 +## Interface4 -
-Click here to see the example -
+```fortran +MODULE SUBROUTINE GetElemNum4(obj, dom, ans, tsize) + CLASS(MeshSelection_), INTENT(IN) :: obj + CLASS(AbstractDomain_), INTENT(IN) :: dom + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize +END SUBROUTINE GetElemNum4 +``` -import EXAMPLE67 from "./examples/_GetElemNum_test_1.md"; +Returns all element numbers across all dimensions using both selection by element number and selection by mesh ID. - +- **dom**: Abstract domain containing the meshes +- **ans**: Array to store the element numbers +- **tsize**: Number of element numbers retrieved -
-
+Note: This routine calls `GetElemNum2` for dim=0,1,2,3. diff --git a/docs/docs-api/MeshSelection/GetTotalElemNum.md b/docs/docs-api/MeshSelection/GetTotalElemNum.md new file mode 100644 index 00000000..8239b890 --- /dev/null +++ b/docs/docs-api/MeshSelection/GetTotalElemNum.md @@ -0,0 +1,92 @@ +# GetTotalElemNum + +Get the total number of elements in the mesh selection. + +The GetTotalElemNum method retrieves the total number of elements in a MeshSelection object. There are four different implementations: + +1. **GetTotalElemNum1**: Returns the total number of elements for a specific dimension when isSelectionByElemNum is true. +2. **GetTotalElemNum2**: Returns the total number of elements for a specific dimension using both selection by element number and selection by mesh ID. +3. **GetTotalElemNum3**: Returns the total number of elements across all dimensions when isSelectionByElemNum is true. +4. **GetTotalElemNum4**: Returns the total number of elements across all dimensions using both selection by element number and selection by mesh ID. + +### Dimension Mapping + +- dim = 0: Size of pointElemNum or elements in pointMeshID +- dim = 1: Size of curveElemNum or elements in curveMeshID +- dim = 2: Size of surfaceElemNum or elements in surfaceMeshID +- dim = 3: Size of volumeElemNum or elements in volumeMeshID + +### Selection Methods Used + +- ✅ isSelectionByMeshID (GetTotalElemNum2, GetTotalElemNum4) +- ✅ isSelectionByElemNum (all variants) +- ❌ isSelectionByNodeNum (not implemented) +- ❌ isSelectionByBox (not implemented) + +## Interface Descriptions + +### GetTotalElemNum1 + +```fortran +MODULE FUNCTION GetTotalElemNum1(obj, dim) RESULT(ans) + CLASS(MeshSelection_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: dim + INTEGER(I4B) :: ans +END FUNCTION GetTotalElemNum1 +``` + +Returns the total number of elements for a specific dimension when isSelectionByElemNum is true. + +- **dim**: Dimension to retrieve element count from (0=point, 1=curve, 2=surface, 3=volume) +- **ans**: Total number of elements in the specified dimension + +Note: This method only works when isSelectionByElemNum is true. + +### GetTotalElemNum2 + +```fortran +MODULE FUNCTION GetTotalElemNum2(obj, dim, dom) RESULT(ans) + CLASS(MeshSelection_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: dim + CLASS(AbstractDomain_), INTENT(IN) :: dom + INTEGER(I4B) :: ans +END FUNCTION GetTotalElemNum2 +``` + +Returns the total number of elements for a specific dimension using both selection by element number and selection by mesh ID. + +- **dim**: Dimension to retrieve element count from (0=point, 1=curve, 2=surface, 3=volume) +- **dom**: Abstract domain containing the meshes +- **ans**: Total number of elements in the specified dimension + +### GetTotalElemNum3 + +```fortran +MODULE FUNCTION GetTotalElemNum3(obj) RESULT(ans) + CLASS(MeshSelection_), INTENT(IN) :: obj + INTEGER(I4B) :: ans +END FUNCTION GetTotalElemNum3 +``` + +Returns the total number of elements across all dimensions when isSelectionByElemNum is true. It sums the sizes of pointElemNum, curveElemNum, surfaceElemNum, and volumeElemNum. + +- **ans**: Total number of elements across all dimensions + +Note: This method only works when isSelectionByElemNum is true. + +### GetTotalElemNum4 + +```fortran +MODULE FUNCTION GetTotalElemNum4(obj, dom) RESULT(ans) + CLASS(MeshSelection_), INTENT(IN) :: obj + CLASS(AbstractDomain_), INTENT(IN) :: dom + INTEGER(I4B) :: ans +END FUNCTION GetTotalElemNum4 +``` + +Returns the total number of elements across all dimensions using both selection by element number and selection by mesh ID. + +- **dom**: Abstract domain containing the meshes +- **ans**: Total number of elements across all dimensions + +Note: This function calls GetTotalElemNum2 for each dimension (0-3) and sums the results. diff --git a/docs/docs-api/MeshSelection/SetMaterialToMesh.md b/docs/docs-api/MeshSelection/SetMaterialToMesh.md new file mode 100644 index 00000000..c08c8e00 --- /dev/null +++ b/docs/docs-api/MeshSelection/SetMaterialToMesh.md @@ -0,0 +1,67 @@ +# SetMaterialToMesh + +The SetMaterialToMesh methods assign material properties to mesh elements based on the mesh selection criteria. There are two implementations: + +1. **SetMaterialToMesh1**: Sets material properties for mesh elements of a specific dimension. +2. **SetMaterialToMesh2**: Sets material properties for mesh elements across all dimensions (0-3). + +Material Assignment Mechanisms: + +- Elements selected by mesh IDs will have their material properties set at the entity level +- Elements selected by element numbers will have their material properties set at the individual element level + +Selection Methods Used: + +- ✅ isSelectionByMeshID +- ✅ isSelectionByElemNum +- ❌ isSelectionByNodeNum (not implemented) +- ❌ isSelectionByBox (not implemented) + +## Interface 1 + +```fortran +MODULE SUBROUTINE SetMaterialToMesh1(obj, dom, dim, medium, material) + CLASS(MeshSelection_), INTENT(INOUT) :: obj + CLASS(AbstractDomain_), INTENT(IN) :: dom + INTEGER(I4B), INTENT(IN) :: dim + INTEGER(I4B), INTENT(IN) :: medium + INTEGER(I4B), INTENT(IN) :: material +END SUBROUTINE SetMaterialToMesh1 +``` + +Sets material properties for mesh elements of a specific dimension. + +- **dom**: Abstract domain containing the meshes +- **dim**: Dimension of the mesh elements to set materials for (0=point, 1=curve, 2=surface, 3=volume) +- **medium**: Medium identifier +- **material**: Material identifier to assign + +Implementation details: + +1. Retrieves the mesh pointer for the specified dimension +2. For elements selected by mesh ID, sets the material at the entity level +3. For elements selected by element number, sets the material at the individual element level + +## Interface 2 + +```fortran +MODULE SUBROUTINE SetMaterialToMesh2(obj, dom, medium, material) + CLASS(MeshSelection_), INTENT(INOUT) :: obj + CLASS(AbstractDomain_), INTENT(IN) :: dom + INTEGER(I4B), INTENT(IN) :: medium + INTEGER(I4B), INTENT(IN) :: material +END SUBROUTINE SetMaterialToMesh2 +``` + +Sets material properties for mesh elements across all dimensions (0-3). + +- **dom**: Abstract domain containing the meshes +- **medium**: Medium identifier +- **material**: Material identifier to assign + +Implementation details: + +1. Calls SetMaterialToMesh1 for each dimension from 0 to 3 +2. This method allows for setting materials across all dimensionalities in a single call + +Note: This method serves as a convenience wrapper around SetMaterialToMesh1, applying the same material and medium values to mesh elements of all dimensions selected in the MeshSelection object. diff --git a/docs/docs-api/MeshSelection/examples/_Export_test_1.F90 b/docs/docs-api/MeshSelection/examples/_Export_test_1.F90 new file mode 100644 index 00000000..224e1ddb --- /dev/null +++ b/docs/docs-api/MeshSelection/examples/_Export_test_1.F90 @@ -0,0 +1,37 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-24 +! summary: This example shows how to USE `MeshSelection` WITH +! `meshSelectionByID` option, and export it to `HDF5File_` format. + +PROGRAM main +USE MeshSelection_Class +USE HDF5File_Class +IMPLICIT NONE + +TYPE(MeshSelection_) :: obj +TYPE(HDF5File_) :: hdf5file + +! Initiates an instance of `MeshSelection_` WITH selection by mesh ID. +CALL obj%Initiate(isSelectionByMeshID=.TRUE.) + +! Let us now add NEW entries. +CALL obj%Add(dim=0, meshID=[1, 2, 3, 4, 5, 6]) +CALL obj%Add(dim=1, meshID=[2, 5, 6, 7]) +CALL obj%Add(dim=2, meshID=[1, 3, 5, 6, 8]) +CALL obj%Add(dim=3, meshID=[1, 8]) + +! Now that we are done setting the DATA in the instance, let us CALL `set` method. +CALL obj%Set() + +! Now we will OPEN a `HDF5File_` so that we can WRITE DATA to it. +CALL hdf5file%Initiate(filename="./hdf5/MeshSelection.hdf5", mode="NEW") +CALL hdf5file%OPEN() + +! After opening the `HDF5File_` we export the instance of `MeshSelection_` to it. +CALL obj%Export(hdf5=hdf5file, group='') + +! Cleanup + +CALL hdf5file%DEALLOCATE() +CALL obj%DEALLOCATE() +END PROGRAM main diff --git a/docs/docs-api/MeshSelection/examples/_Export_test_1.md b/docs/docs-api/MeshSelection/examples/_Export_test_1.md index d263c4c4..52512cdf 100644 --- a/docs/docs-api/MeshSelection/examples/_Export_test_1.md +++ b/docs/docs-api/MeshSelection/examples/_Export_test_1.md @@ -1,53 +1,9 @@ -This example shows how to USE `MeshSelection` WITH `meshSelectionByID` option, and export it to `HDF5File_` format. +This example shows how to USE `MeshSelection` WITH `meshSelectionByID` option, +and export it to `HDF5File_` format. -```fortran -PROGRAM main - USE easifemBase - USE easifemClasses - IMPLICIT NONE - TYPE( MeshSelection_ ) :: obj - TYPE( HDF5File_ ) :: hdf5file -``` +import CodeBlock from '@theme/CodeBlock'; -Initiates an instance of `MeshSelection_` WITH selection by mesh ID. +import CodeSnippet from '!!raw-loader!./_Export_test_1.F90'; -```fortran -CALL obj%Initiate( isSelectionByMeshID=.TRUE. ) -``` +{CodeSnippet} -Let us now add NEW entries. - -```fortran -CALL obj%Add( dim=0, meshID=[1,2,3,4,5,6]) -CALL obj%Add( dim=1, meshID=[2,5,6,7]) -CALL obj%Add( dim=2, meshID=[1,3,5,6,8]) -CALL obj%Add( dim=3, meshID=[1,8]) -``` - -Now that we are done setting the DATA in the instance, let us CALL `set` method. - -```fortran -CALL obj%Set() -``` - -Now we will OPEN a `HDF5File_` so that we can WRITE DATA to it. - -```fortran -CALL hdf5file%Initiate(filename="./TemplateMeshSelection.hdf5", & - & mode="NEW") -CALL hdf5file%Open() -``` - -After opening the `HDF5File_` we export the instance of `MeshSelection_` to it. - -```fortran -CALL obj%Export(hdf5=hdf5file, group='') -``` - -Cleanup - -```fortran - CALL hdf5file%Deallocate() - CALL obj%Deallocate() -END PROGRAM main -``` diff --git a/docs/docs-api/MeshSelection/examples/_GetElemNum_test_1.F90 b/docs/docs-api/MeshSelection/examples/_GetElemNum_test_1.F90 new file mode 100644 index 00000000..308c73fa --- /dev/null +++ b/docs/docs-api/MeshSelection/examples/_GetElemNum_test_1.F90 @@ -0,0 +1,127 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-24 +! summary: This example demonstrates the usage of `getElemNum()` method. + +PROGRAM main +USE GlobalData, ONLY: I4B, DFP, LGT +USE MeshSelection_Class +USE FEDomain_Class +USE HDF5File_Class +USE Display_Method +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE ArangeUtility, ONLY: Arange +USE Test_Method +USE SortUtility, ONLY: Sort +USE AppendUtility, ONLY: OPERATOR(.append.) + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: modName = __FILE_NAME__ +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +TYPE(MeshSelection_) :: obj +TYPE(FEDomain_) :: dom +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: telem, tsize +LOGICAL(LGT) :: isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +CALL obj%Initiate(isSelectionByMeshID=.TRUE.) + +CALL obj%Add(dim=2, meshID=[1]) +CALL obj%Add(dim=1, meshID=[1, 2]) +CALL obj%Set() + +CALL test1 +CALL test2 +CALL test3 + +CALL obj%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CHARACTER(*), PARAMETER :: myName = "test1" + + CALL e%RaiseInformation(modName//'::'//myName//' - '// & + '[START] ') + + telem = obj%GetTotalElemNum(dom=dom, dim=2) + + CALL Reallocate(found, telem) + CALL obj%GetElemNum(dom=dom, dim=2, ans=found, tsize=tsize) + + want = Arange(13, 26) + isok = ALL(found == want) + CALL OK(isok, "GetElemNum for dim=2 with dom") + IF (isok) THEN + CALL Display(telem, " GetTotalElemNum for dim=2 with dom: ") + END IF + ! CALL Display(found, "getElemNum =", orient='row') + + CALL e%RaiseInformation(modName//'::'//myName//' - '// & + '[END] ') +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + CHARACTER(*), PARAMETER :: myName = "test2" + + CALL e%RaiseInformation(modName//'::'//myName//' - '// & + '[START] ') + + telem = obj%GetTotalElemNum(dom=dom, dim=1) + CALL Reallocate(found, telem) + CALL obj%GetElemNum(dom=dom, dim=1, ans=found, tsize=tsize) + + want = Arange(5, 8) + isok = ALL(found == want) + CALL OK(isok, "GetElemNum for dim=1 with dom") + ! CALL Display(found, "getElemNum =", orient='row') + IF (isok) THEN + CALL Display(telem, " GetTotalElemNum for dim=1 with dom: ") + END IF + + CALL e%RaiseInformation(modName//'::'//myName//' - '// & + '[END] ') +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + CHARACTER(*), PARAMETER :: myName = "test3" + + CALL e%RaiseInformation(modName//'::'//myName//' - '// & + '[START] ') + + telem = obj%GetTotalElemNum(dom=dom) + isok = telem .EQ. 18 + CALL OK(isok, "GetTotalElemNum with dom: ") + + CALL Reallocate(found, telem) + CALL obj%GetElemNum(dom=dom, ans=found, tsize=tsize) + + want = Sort(Arange(5, 8) .append.Arange(13, 26)) + isok = ALL(found == want) + CALL OK(isok, "GetElemNum with dom: ") + + CALL e%RaiseInformation(modName//'::'//myName//' - '// & + '[END] ') +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/MeshSelection/examples/_GetElemNum_test_1.md b/docs/docs-api/MeshSelection/examples/_GetElemNum_test_1.md index 73b4d4eb..8f293660 100644 --- a/docs/docs-api/MeshSelection/examples/_GetElemNum_test_1.md +++ b/docs/docs-api/MeshSelection/examples/_GetElemNum_test_1.md @@ -1,38 +1,7 @@ -This example demonstrates the usage of `getElemNum()` method. +This example demonstrates the usage of `GetElemNum()` and `GetTotalElemNum` method. -```fortran -PROGRAM main -USE easifemBase -USE easifemClasses -IMPLICIT NONE -TYPE( MeshSelection_ ) :: obj -TYPE(Domain_) :: dom -TYPE(HDF5File_) :: meshfile -TYPE(IntVector_) :: intvec +import CodeBlock from '@theme/CodeBlock'; -CALL meshfile%Initiate("./mesh.h5", mode="READ") -CALL meshfile%Open() +import CodeSnippet from '!!raw-loader!./_GetElemNum_test_1.F90'; -CALL dom%Initiate(meshfile, '') - -CALL obj%Initiate( isSelectionByMeshID=.TRUE. ) - -CALL obj%Add( dim=2, meshID=[1]) - -CALL obj%Set() - -intvec = obj%getElemNum(domain=dom, dim=2) -CALL Display(intvec, "getElemNum =", orient='row') - -CALL obj%Deallocate() -CALL obj%Add(dim=1, meshID=[1,2]) -CALL obj%Set() -intvec = obj%getElemNum(domain=dom, dim=1) -CALL Display(intvec, "getElemNum =", orient='row') - -intvec = obj%getElemNum(domain=dom) -CALL Display(intvec, "getElemNum =", orient='row') - -CALL obj%Deallocate() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/MeshSelection/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/MeshSelection/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..51e2d90e --- /dev/null +++ b/docs/docs-api/MeshSelection/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,33 @@ +! This program is a part of EASIFEM library +! Copyright (C) 2020-2021 Vikas Sharma, Ph.D +! +! This program is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation, either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License +! along with this program. If not, see +! + +!> author: Vikas Sharma, Ph. D. +! date: 2023-11-15 +! summary: SelectioByMeshID + +PROGRAM main +USE MeshSelection_Class +IMPLICIT NONE + +TYPE(MeshSelection_) :: obj +CHARACTER(*), PARAMETER :: filename = "./toml/MeshSelection.toml" + +CALL obj%ImportFromToml(filename=filename, tomlName="region") +CALL obj%Display("") + +CALL obj%DEALLOCATE() +END PROGRAM main diff --git a/docs/docs-api/MeshSelection/examples/_Initiate_test_1.F90 b/docs/docs-api/MeshSelection/examples/_Initiate_test_1.F90 index f8552b14..92ecc926 100644 --- a/docs/docs-api/MeshSelection/examples/_Initiate_test_1.F90 +++ b/docs/docs-api/MeshSelection/examples/_Initiate_test_1.F90 @@ -1,3 +1,7 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-24 +! summary: The method Initiate + PROGRAM main USE MeshSelection_Class USE FPL diff --git a/docs/docs-api/MeshSelection/examples/hdf5/MeshSelection.hdf5 b/docs/docs-api/MeshSelection/examples/hdf5/MeshSelection.hdf5 new file mode 100644 index 00000000..a218f817 Binary files /dev/null and b/docs/docs-api/MeshSelection/examples/hdf5/MeshSelection.hdf5 differ diff --git a/docs/docs-api/MeshSelection/examples/runner.toml b/docs/docs-api/MeshSelection/examples/runner.toml index a33dbce2..61daa1ac 100644 --- a/docs/docs-api/MeshSelection/examples/runner.toml +++ b/docs/docs-api/MeshSelection/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/mesh-selection/" +BuildDir = "/tmp/easifem-tests/MeshSelection" TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/MeshSelection/examples/MeshSelection.toml b/docs/docs-api/MeshSelection/examples/toml/MeshSelection.toml similarity index 96% rename from docs/docs-api/MeshSelection/examples/MeshSelection.toml rename to docs/docs-api/MeshSelection/examples/toml/MeshSelection.toml index f41a97ac..5c8c63f1 100644 --- a/docs/docs-api/MeshSelection/examples/MeshSelection.toml +++ b/docs/docs-api/MeshSelection/examples/toml/MeshSelection.toml @@ -8,7 +8,7 @@ isSelectionByNodeNum = false point = [1, 2, 3, 4, 5, 6] # "filename.txt" line = [2, 5, 6, 7] # "filename.txt" surface = [1, 3, 5, 6, 8] # "filename.txt" -volume = "./meshID_volume.txt" +volume = "./toml/meshID_volume.txt" [region.elemNum] point = [1, 2, 3] diff --git a/docs/docs-api/OneDimFEDOF/Copy.md b/docs/docs-api/OneDimFEDOF/Copy.md new file mode 100644 index 00000000..1613be19 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/Copy.md @@ -0,0 +1,67 @@ +# Copy + +The `Copy` method copies the contents of one `FEDOF_` object to another. This method is also used by the assignment operator (`=`) for `FEDOF_` objects. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE Copy(obj, obj2) + CLASS(FEDOF_), INTENT(INOUT) :: obj + CLASS(FEDOF_), INTENT(IN) :: obj2 + END SUBROUTINE Copy +END INTERFACE +``` + +## Parameters + +- `obj` - The destination `FEDOF_` object that will receive the copied data +- `obj2` - The source `FEDOF_` object whose data will be copied + +## Implementation Details + +The method performs a shallow copy of most attributes from `obj2` to `obj`: + +1. Copies basic properties: + - `isLagrange` - Flag indicating if the base interpolation is Lagrange + - `tdof` - Total number of degrees of freedom + - `tNodes`, `tEdges`, `tFaces`, `tCells` - Total count of different mesh entities + - `baseContinuity` - Continuity or conformity of basis (e.g., "H1") + - `baseInterpolation` - Type of basis functions (e.g., "LAGR", "HIER") + - `maxCellOrder`, `maxFaceOrder`, `maxEdgeOrder` - Maximum order values + +2. Sets the mesh pointer to point to the same mesh as the source object: + +```fortran +obj%mesh => obj2%mesh +``` + +3. Copies array data when allocated in the source object: + - `cellOrder` - Order of each cell + - `faceOrder` - Order of each face + - `edgeOrder` - Order of each edge + - `edgeIA`, `faceIA`, `cellIA` - Sparsity patterns for different entities + +4. Associates finite element pointers: + +```fortran +DO ii = 1, SIZE(obj2%fe) + isok = ASSOCIATED(obj2%fe(ii)%ptr) + IF (isok) THEN + obj%fe(ii)%ptr => obj2%fe(ii)%ptr + END IF +END DO +``` + +## Notes + +- This is a shallow copy - the mesh and finite element pointers in the destination object point to the same objects as the source. +- Array data is copied only if it exists in the source object. +- The method doesn't allocate new memory for arrays; it assumes the destination arrays either don't exist or are already properly allocated. +- This method is particularly useful when you need to create a duplicate of a `FEDOF_` object without creating new underlying mesh or finite element instances. + +## Example + +import EXAMPLE65 from "./examples/_Copy_test_1.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/Deallocate.md b/docs/docs-api/OneDimFEDOF/Deallocate.md new file mode 100644 index 00000000..d7437a09 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/Deallocate.md @@ -0,0 +1,41 @@ +# Deallocate + +The `Deallocate` method releases all allocated memory and nullifies pointers in a `FEDOF_` object, returning it to an uninitialized state. This method is essential for proper memory management to prevent memory leaks. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE DEALLOCATE (obj) + CLASS(FEDOF_), INTENT(INOUT) :: obj + END SUBROUTINE DEALLOCATE +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object to be deallocated + +## Notes + +- This method checks if arrays are allocated before attempting to deallocate them, preventing potential runtime errors. +- For each associated finite element pointer, it calls the `DEALLOCATE` method of the finite element object before nullifying the pointer. +- The method does not deallocate the mesh itself, as the `FEDOF_` object only maintains a pointer to the mesh, which might be used elsewhere. +- After calling this method, the `FEDOF_` object is reset to its default state and can be reused for a new initialization. + +## Example Usage + +```fortran +TYPE(FEDOF_) :: dof + +! After using dof... +CALL dof%DEALLOCATE() + +! Now dof can be reused or safely go out of scope +``` + +## Important Considerations + +- This method should be called when the `FEDOF_` object is no longer needed to prevent memory leaks. +- It's particularly important to call this method before reinitializing an existing `FEDOF_` object to avoid memory leaks. +- The method only deallocates resources directly owned by the `FEDOF_` object; it does not deallocate the mesh or other external resources that might be referenced by pointers. diff --git a/docs/docs-api/OneDimFEDOF/GetBaseInterpolation.md b/docs/docs-api/OneDimFEDOF/GetBaseInterpolation.md new file mode 100644 index 00000000..7cf9bab1 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetBaseInterpolation.md @@ -0,0 +1,80 @@ +# GetBaseInterpolation + +The `GetBaseInterpolation` method returns the type of basis functions used for interpolation on the reference element in the FEDOF (Finite Element Degrees of Freedom) instance. + +## Interface + +The specific interface is defined as: + +```fortran +MODULE FUNCTION obj_GetBaseInterpolation(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CHARACTER(:), ALLOCATABLE :: ans +END FUNCTION obj_GetBaseInterpolation +``` + +## Description + +The `GetBaseInterpolation` method returns the type of basis functions used for interpolation on the reference element in the FEDOF (Finite Element Degrees of Freedom) instance. This information is crucial for understanding how the finite element approximation is constructed. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `CHARACTER(:), ALLOCATABLE`, string containing the base interpolation type + +### Implementation Details + +The implementation is straightforward, returning the internal `baseInterpolation` property: + +```fortran +MODULE PROCEDURE obj_GetBaseInterpolation +ans = obj%baseInterpolation +END PROCEDURE obj_GetBaseInterpolation +``` + +### Possible Return Values + +The method returns one of the following interpolation types: + +- `"LAGR"` - Lagrange interpolation +- `"HIER"` - Hierarchical interpolation +- `"ORTHO"` - Orthogonal interpolation +- `"HERM"` - Hermite interpolation +- `"SERE"` - Serendipity interpolation + +## Usage Example + +```fortran +! Example to get the base interpolation type +CHARACTER(:), ALLOCATABLE :: interpType +TYPE(FEDOF_) :: myDOF + +! Get the interpolation type +interpType = myDOF%GetBaseInterpolation() + +! Check interpolation type and take appropriate action +SELECT CASE (interpType) +CASE ("LAGR") + PRINT *, "Using Lagrange interpolation" +CASE ("HIER") + PRINT *, "Using Hierarchical interpolation" +CASE DEFAULT + PRINT *, "Using other interpolation type: ", interpType +END SELECT +``` + +## Important Notes + +1. The base interpolation type works in conjunction with the base continuity (e.g., "H1", "HCurl", "HDiv", "DG") to determine the complete function space used. +2. The `GetCaseName` method combines the base continuity and base interpolation into a single identifier (e.g., "H1LAGR"). +3. Different interpolation types have different mathematical properties and are suitable for different types of problems. + +## Related Methods + +- `GetCaseName` - Returns the combined continuity and interpolation identifier +- `GetLocalElemShapeData` - Uses the interpolation type to determine which shape functions to compute +- `GetLocalElemShapeDataH1Lagrange` - Specialized method for Lagrange interpolation +- `GetLocalElemShapeDataH1Hierarchical` - Specialized method for Hierarchical interpolation + +The `GetBaseInterpolation` method is important for understanding the mathematical basis of the finite element approximation and is often used to determine which specialized algorithms should be applied for shape function evaluation and element matrix assembly. + diff --git a/docs/docs-api/OneDimFEDOF/GetCaseName.md b/docs/docs-api/OneDimFEDOF/GetCaseName.md new file mode 100644 index 00000000..a092d456 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetCaseName.md @@ -0,0 +1,81 @@ +# GetCaseName + +The `GetCaseName` method returns a string that identifies the combination of continuity and interpolation type used in the finite element degree of freedom object. This case name is used internally to determine which algorithms to apply when processing the finite element data. + +## Interface + +```fortran +INTERFACE + MODULE FUNCTION GetCaseName(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CHARACTER(6) :: ans + END FUNCTION GetCaseName +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object from which to obtain the case name + +## Return Value + +- `ans` - A 6-character string combining the basis continuity and the interpolation type + +## Implementation Details + +The method is straightforward, concatenating the `baseContinuity` and `baseInterpolation` properties of the `FEDOF_` object: + +```fortran +ans = obj%baseContinuity//obj%baseInterpolation +``` + +## Possible Return Values + +The return value is a combination of the continuity type and interpolation type: + +1. For continuity (`obj%baseContinuity`): + - `"H1"` - Standard $H^{1}$ conforming elements + - `"HC[url]"` - H(curl) conforming elements + - `"HD[iv]"` - H(div) conforming elements + - `"DG"` - Discontinuous Galerkin elements + +2. For interpolation (`obj%baseInterpolation`): + - `"LAGR"` - Lagrange interpolation + - `"HIER"` - Hierarchical interpolation + - `"ORTHO"` - Orthogonal interpolation + - `"HERM"` - Hermite interpolation + - `"SERE"` - Serendipity interpolation + +Common combinations include: + +- `"H1LAGR"` - H¹ conforming elements with Lagrange interpolation +- `"H1HIER"` - H¹ conforming elements with hierarchical interpolation +- `"DGHIER"` - Discontinuous Galerkin with hierarchical interpolation + +## Usage Examples + +The case name is primarily used in conditional branching to select the appropriate algorithms for a given finite element type: + +```fortran +CHARACTER(6) :: casename +casename = fedof%GetCaseName() + +SELECT CASE (casename) +CASE ('H1LAGR') + ! Process H¹ conforming elements with Lagrange interpolation +CASE ('H1HIER') + ! Process H¹ conforming elements with hierarchical interpolation +CASE ('DGHIER') + ! Process Discontinuous Galerkin with hierarchical interpolation +CASE DEFAULT + ! Handle unexpected case +END SELECT +``` + +This method is used extensively within the `FEDOF_` class to determine the appropriate algorithms for shape function calculation, connectivity generation, and other operations that depend on the specific type of finite element formulation. + +## Example + +import EXAMPLE80 from "./examples/_GetCaseName_test_1.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetCellDOF.md b/docs/docs-api/OneDimFEDOF/GetCellDOF.md new file mode 100644 index 00000000..6ceb04e0 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetCellDOF.md @@ -0,0 +1,57 @@ +# GetCellDOF + +Get the degrees of freedom associated with a specific cell (element volume) in the finite element mesh. + +## Interface + +```fortran +MODULE SUBROUTINE GetCellDOF(obj, globalCell, ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalCell + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal +END SUBROUTINE GetCellDOF +``` + +## Parameters + +- `obj`: The FEDOF_ object +- `globalCell`: Global cell number to retrieve DOFs for +- `ans`: Integer array to store the retrieved DOFs +- `tsize`: Output parameter containing the total size of data written in ans +- `islocal`: Optional logical flag - if true, globalCell is treated as a local cell number + +## Functionality + +This method retrieves all degrees of freedom associated with a specific cell (element volume) identified by its global cell number. It performs the following operations: + +1. Converts the global cell number to a local cell number if needed +2. Accesses the cell DOF information using the cell index array (`cellIA`) +3. Populates the `ans` array with the DOF indices for the specified cell +4. Sets `tsize` to the number of DOFs associated with the cell + +The implementation leverages the cell sparsity pattern stored in the `cellIA` array, which provides the start and end indices for each cell's DOF information. + +## Implementation Details + +The method first converts the global cell number to a local cell number using the mesh's `GetLocalElemNumber` method. It then iterates through the DOF indices stored for this cell, copying each one into the `ans` array and incrementing the `tsize` counter. + +## Usage + +The `GetCellDOF` method is important for finite element implementations where you need to: + +- Assemble matrices based on cell (volume) contributions +- Apply internal conditions on specific cells +- Compute cell-based integrals or other operations +- Access all degrees of freedom associated with a cell for post-processing + +Unlike vertex, edge, or face DOFs which are typically shared between elements, cell DOFs are internal to a specific element, making them important for capturing high-order behavior within elements. + +## Example 1 + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./examples/_GetCellDOF_test_1.md'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/GetCellOrder.md b/docs/docs-api/OneDimFEDOF/GetCellOrder.md new file mode 100644 index 00000000..a5b0fa46 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetCellOrder.md @@ -0,0 +1,82 @@ +# GetCellOrder + +The `GetCellOrder` method retrieves the polynomial order of a specified cell element. + +## Interface + +```fortran +MODULE SUBROUTINE obj_GetCellOrder(obj, cellOrder, tCellOrder, globalElement, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + !! fedof object + INTEGER(I4B), INTENT(INOUT) :: cellOrder(:) + !! cell order + INTEGER(I4B), INTENT(OUT) :: tCellOrder + !! size of data written in cellOrder + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local element number + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then globalElement is local element +END SUBROUTINE obj_GetCellOrder +``` + +## Description + +The `GetCellOrder` method retrieves the polynomial order of a specified cell element. The polynomial order determines the degree of the basis functions used for approximation within that element, which directly impacts the accuracy and computational cost of the finite element solution. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `cellOrder` - Output, `INTEGER(I4B)(:)`, pre-allocated array to store the cell order +- `tCellOrder` - Output, `INTEGER(I4B)`, total size of data written to the `cellOrder` array (typically 1) +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +The implementation converts the global element number to a local element number if needed, then retrieves the cell order from the internal storage: + +```fortran +INTEGER(I4B) :: jj + +jj = obj%mesh%GetLocalElemNumber(globalElement=globalElement, islocal=islocal) + +cellOrder(1) = obj%cellOrder(jj) +tcellOrder = 1 +``` + +## Usage Example + +```fortran +! Example to get the order of a cell +INTEGER(I4B) :: order(1), tOrder +TYPE(FEDOF_) :: myDOF + +! Get order for element #5 +CALL myDOF%GetCellOrder(cellOrder=order, tCellOrder=tOrder, globalElement=5) +PRINT *, "Element 5 has order:", order(1) + +! Get order for element #3 using local numbering +CALL myDOF%GetCellOrder(cellOrder=order, tCellOrder=tOrder, globalElement=3, islocal=.TRUE.) +PRINT *, "Local element 3 has order:", order(1) +``` + +## Important Notes + +1. The `cellOrder` array typically only needs one element as this method returns a single value +2. The `tCellOrder` return value will typically be 1, indicating a single value written to `cellOrder` +3. In p-adaptive finite element methods, different cells may have different polynomial orders + +## Related Methods + +- `GetOrders` - More comprehensive method that returns cell, face, and edge orders along with their orientations +- `SetCellOrder` - Sets the polynomial order for cells +- `GetLocalElemShapeData` - Uses the cell order to determine the appropriate shape functions +- `GetQuadraturePoints` - Often needs the cell order to determine appropriate quadrature rules + +The `GetCellOrder` method is important for finite element implementations that use p-adaptive methods or variable-order elements, where the polynomial degree may vary between elements to optimize computational efficiency. + +## Example + +import EXAMPLE81 from "./examples/_GetCellOrder_test_1.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetConnectivity.md b/docs/docs-api/OneDimFEDOF/GetConnectivity.md new file mode 100644 index 00000000..65d97e22 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetConnectivity.md @@ -0,0 +1,70 @@ +# GetConnectivity + +The `GetConnectivity` method returns the global degrees of freedom (DOFs) associated with a specified element in the mesh. This connectivity information is essential for assembling local element matrices and vectors into the global system during finite element analysis. + +## Interface + +```fortran +INTERFACE + MODULE FUNCTION GetConnectivity(obj, opt, globalElement, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(INOUT) :: obj + CHARACTER(*), INTENT(IN) :: opt + INTEGER(I4B), INTENT(IN) :: globalElement + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + INTEGER(I4B), ALLOCATABLE :: ans(:) + END FUNCTION GetConnectivity +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object containing degree of freedom information +- `opt` - A string specifying which type of connectivity to retrieve: + - `"Vertex"` - Only vertex DOFs + - `"Edge"` - Only edge DOFs + - `"Face"` - Only face DOFs + - `"Cell"` - Only cell DOFs + - `"All"` - All DOFs (vertices, edges, faces, and cells) +- `globalElement` - The global or local element number, depending on the value of `islocal` +- `islocal` - Optional logical flag. If present and `.TRUE.`, `globalElement` is interpreted as a local element number; otherwise, it's a global element number + +## Return Value + +- `ans` - An allocatable array containing the global DOF numbers associated with the specified element, filtered according to the `opt` parameter + +## Implementation Details + +The function: + +1. Determines the total number of DOFs for the element using `obj%GetTotalDOF` +2. Allocates the return array with the appropriate size +3. Calls the `obj%GetConnectivity_` subroutine to populate the array with the actual connectivity data + +The key steps in the implementation are: + +```fortran +tdof = obj%GetTotalDOF(globalElement=globalElement, isLocal=isLocal) +ALLOCATE (ans(tdof)) +CALL obj%GetConnectivity_(ans=ans, tsize=tdof, opt=opt, +globalElement = globalElement, islocal = islocal) +``` + +The underlying `GetConnectivity_` subroutine performs the actual work of gathering the connectivity data by: + +1. Getting the element's topological entities (vertices, edges, faces, and cells) +2. Retrieving the DOFs for each entity using the appropriate methods (`GetVertexDOF`, `GetEdgeDOF`, etc.) +3. Combining these DOFs into a single connectivity array + +## Notes + +- For Lagrangian elements (`obj%isLagrange` is `.TRUE.`), only vertex DOFs are considered, regardless of the `opt` parameter +- For hierarchical elements, the connectivity includes all specified entity types (vertices, edges, faces, cells) +- The connectivity array contains global DOF numbers that map the local element DOFs to the global system +- The order of DOFs in the returned array follows a hierarchical pattern: vertices first, then edges, faces, and finally cell DOFs +- This method is crucial for element assembly operations in finite element analysis + +## Example + +import EXAMPLE68 from "./examples/_GetConnectivity_test_1.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetConnectivity_.md b/docs/docs-api/OneDimFEDOF/GetConnectivity_.md new file mode 100644 index 00000000..8e57dd14 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetConnectivity_.md @@ -0,0 +1,94 @@ +# GetConnectivity_ + +## Interface + +```fortran +MODULE SUBROUTINE obj_GetConnectivity_(obj, ans, tsize, opt, globalElement, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! FEDOF object + INTEGER(I4B), INTENT(INOUT) :: ans(:) + !! connectivity of element + INTEGER(I4B), INTENT(OUT) :: tsize + !! total size of data written in con + CHARACTER(*), INTENT(IN) :: opt + !! opt = Vertex + !! opt = Edge + !! opt = Face + !! opt = Cell + !! opt = All + INTEGER(I4B), INTENT(IN) :: globalElement + !! Global element number + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if islocal true then globalElement is local element number +END SUBROUTINE obj_GetConnectivity_ +``` + +## Description + +The `GetConnectivity_` method retrieves the connectivity (degrees of freedom) of a specified element and writes it into a provided array. This method allows for filtering the types of entities (vertices, edges, faces, cells) to include in the connectivity. + +### Parameters + +- `obj` - Input/Output, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `INTEGER(I4B)(:)`, pre-allocated array to store the connectivity information +- `tsize` - Output, `INTEGER(I4B)`, total size of data written to the `ans` array +- `opt` - Input, `CHARACTER(*)`, option specifying which entities to include: + - `"Vertex"` - Include only vertex DOFs + - `"Edge"` - Include only edge DOFs + - `"Face"` - Include only face DOFs + - `"Cell"` - Include only cell DOFs + - `"All"` - Include all DOFs (default) +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +The implementation follows these steps: + +1. Converts the global element number to a local element number if needed +2. Gets the total entities (vertices, edges, faces, cells) for the element +3. Retrieves the connectivity from the mesh for the specified element +4. Processes each entity type (vertices, edges, faces, cells) and adds their DOFs to the `ans` array +5. Updates `tsize` with the total number of DOFs added + +```fortran +localElement = obj%mesh%GetLocalElemNumber(globalElement=globalElement, islocal=islocal) +ent = obj%mesh%GetTotalEntities(globalElement=localElement, islocal=yes) +CALL obj%mesh%GetConnectivity_(globalElement=localElement, islocal=yes, opt=opt, tsize=jj, ans=temp) + +! Process vertices, edges, faces, and cells... +! For each entity, call the appropriate GetXXXDOF method and add to ans array + +tsize = jj - 1 +``` + +## Usage Example + +```fortran +! Example to get connectivity for an element +INTEGER(I4B) :: conn(100), totalSize +TYPE(FEDOF_) :: myDOF + +! Get all DOFs for element #5 +CALL myDOF%GetConnectivity_(ans=conn, tsize=totalSize, opt="All", globalElement=5) + +! Get only vertex DOFs for element #8 +CALL myDOF%GetConnectivity_(ans=conn, tsize=totalSize, opt="Vertex", globalElement=8) + +! Get only edge DOFs for element #3, using local numbering +CALL myDOF%GetConnectivity_(ans=conn, tsize=totalSize, opt="Edge", globalElement=3, islocal=.TRUE.) +``` + +## Important Notes + +1. The `ans` array must be pre-allocated with sufficient size to hold all the requested DOFs +2. The `tsize` return value indicates how many values were actually written to `ans` +3. This method is often used internally by the functional variant `GetConnectivity` + +## Related Methods + +- `GetConnectivity` - Function version that allocates and returns the connectivity array +- `GetVertexDOF`, `GetEdgeDOF`, `GetFaceDOF`, `GetCellDOF` - Methods for retrieving specific entity DOFs +- `GetTotalDOF` - Used to determine the required size for connectivity arrays + +The `GetConnectivity_` method provides a lower-level interface for retrieving connectivity information, offering more control over memory allocation compared to the functional `GetConnectivity` method. diff --git a/docs/docs-api/OneDimFEDOF/GetEdgeDOF.md b/docs/docs-api/OneDimFEDOF/GetEdgeDOF.md new file mode 100644 index 00000000..2ab745c4 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetEdgeDOF.md @@ -0,0 +1,76 @@ +# GetEdgeDOF + +The `GetEdgeDOF` is a generic method in the `FEDOF_` class that retrieves degrees of freedom associated with edges. It has two specific implementations: + +| Method | Description | +| ----------- | -------------------------------------------------------------------------------- | +| GetEdgeDOF1 | Gets edge degrees of freedom using the global edge number | +| GetEdgeDOF2 | Gets edge degrees of freedom using a global element number and local edge number | + +## Interface 1 + +```fortran +MODULE SUBROUTINE GetEdgeDOF(obj, globalEdge, ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalEdge + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal +END SUBROUTINE GetEdgeDOF +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalEdge`: Global edge number to retrieve DOFs for +- `ans`: Integer array to store the retrieved DOFs +- `tsize`: Output parameter containing the total size of data written in ans +- `islocal`: Optional logical flag - if true, globalEdge is treated as a local edge number + +### Functionality + +This method retrieves all degrees of freedom associated with a specific edge identified by its global edge number. It looks up the edge DOFs in the `edgeIA` array which contains the sparsity pattern for edges. + +## Interface 2 + +```fortran +MODULE SUBROUTINE GetEdgeDOF2(obj, globalElement, localEdgeNumber, & + ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local cell element number + INTEGER(I4B), INTENT(IN) :: localEdgeNumber + !! local edge number in global element + INTEGER(I4B), INTENT(INOUT) :: ans(:) + !! edge degree of freedom + INTEGER(I4B), INTENT(OUT) :: tsize + !! tota size of data written in ans + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + !! if true then globalElement is local element +END SUBROUTINE GetEdgeDOF2 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalElement`: Global element number containing the edge +- `localEdgeNumber`: Local edge number within the element +- `ans`: Integer array to store the retrieved DOFs +- `tsize`: Output parameter containing the total size of data written in ans +- `islocal`: Optional logical flag - if true, globalElement is treated as a local element number + +### Functionality + +This method first converts the element and local edge information to a global edge number, then calls `GetEdgeDOF` to retrieve the DOFs. It uses the mesh information to determine the global edge number from the element and local edge number. + +## Usage + +This method is important for finite element implementations where you need to: + +- Assemble matrices based on edge contributions +- Apply boundary conditions on specific edges +- Compute edge-based integrals or other operations + +The generic interface allows users to retrieve edge DOFs either by directly specifying the global edge number or by specifying an element and the local edge number within that element, providing flexibility in how edge data is accessed. + +## Example diff --git a/docs/docs-api/OneDimFEDOF/GetFaceDOF.md b/docs/docs-api/OneDimFEDOF/GetFaceDOF.md new file mode 100644 index 00000000..20d13ffd --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetFaceDOF.md @@ -0,0 +1,95 @@ +# GetFaceDOF + +The `GetFaceDOF` generic method in the `FEDOF_Class` is used to retrieve the degrees of freedom (DOF) associated with a face in a finite element mesh. This method has two specific implementations with different parameter sets. + +## Method Description + +The `GetFaceDOF` generic method retrieves face degrees of freedom through two different interfaces: + +1. `GetFaceDOF1` - Gets DOFs directly using a global face number +2. `GetFaceDOF2` - Gets DOFs using a global element number and local face number within that element + +## Interface 1 + +```fortran +SUBROUTINE obj_GetFaceDOF1(obj, globalFace, ans, tsize, islocal) +``` + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalFace` - Input, `INTEGER(I4B)`, global face number +- `ans` - Output, `INTEGER(I4B)(:)`, array to store face degrees of freedom +- `tsize` - Output, `INTEGER(I4B)`, total size of data written to `ans` +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalFace` is treated as a local face number + +### Implementation Details + +The implementation in `GetMethods` submodule uses the internal face index array structure: + +```fortran +INTEGER(I4B) :: ii +tsize = 0 +DO ii = obj%faceIA(globalface), obj%faceIA(globalface + 1) - 1 + tsize = tsize + 1 + ans(tsize) = ii +END DO +``` + +The method retrieves DOFs from the face sparsity data structure using the compressed sparse row format stored in `faceIA`. + +## Interface 2 + +```fortran +SUBROUTINE obj_GetFaceDOF2(obj, globalElement, localFaceNumber, ans, tsize, islocal) +``` + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, DOF object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `localFaceNumber` - Input, `INTEGER(I4B)`, local face number in global element +- `ans` - Output, `INTEGER(I4B)(:)`, array to store face degrees of freedom +- `tsize` - Output, `INTEGER(I4B)`, total size of data written to `ans` +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +This implementation first converts the element and local face information to a global face number, then calls the first implementation: + +```fortran +INTEGER(I4B) :: globalFace +globalFace = obj%mesh%GetGlobalFaceNumber(globalElement=globalElement, & + islocal=islocal, localFaceNumber=localFaceNumber) +CALL obj%GetFaceDOF(globalFace=globalFace, ans=ans, tsize=tsize, & + islocal=islocal) +``` + +## Usage Example + +```fortran +! Example to get DOFs from a face +INTEGER(I4B) :: faceDOFs(100), totalDOFs +TYPE(FEDOF_) :: myDOF + +! Method 1: Using global face number +CALL myDOF%GetFaceDOF(globalFace=5, ans=faceDOFs, tsize=totalDOFs) + +! Method 2: Using element and local face number +CALL myDOF%GetFaceDOF(globalElement=10, localFaceNumber=2, ans=faceDOFs, tsize=totalDOFs) +``` + +## Related Methods + +- `GetTotalFaceDOF` - Returns the total number of DOFs on a face +- `GetEdgeDOF` - Similar function but for element edges +- `GetCellDOF` - Gets DOFs for volumetric elements +- `GetVertexDOF` - Gets DOFs for element vertices + +Need any additional details about these methods? + +## Example + +import EXAMPLE93 from "./examples/_GetFaceDOF_test_1.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetGlobalElemShapeData.md b/docs/docs-api/OneDimFEDOF/GetGlobalElemShapeData.md new file mode 100644 index 00000000..16a02e9c --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetGlobalElemShapeData.md @@ -0,0 +1,88 @@ +# GetGlobalElemShapeData + +The `GetGlobalElemShapeData` method computes the global element shape function data (including shape functions, their derivatives, and related information) for a specified element. This method takes the local element shape function data and transforms it to the global coordinate system using the nodal coordinates provided in `xij`. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE GetGlobalElemShapeData(obj, globalElement, elemsd, & + xij, geoElemsd, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! Abstract finite element + INTEGER(I4B), INTENT(IN) :: globalElement + !! shape function data + TYPE(ElemshapeData_), INTENT(INOUT) :: elemsd + !! global element shape data + REAL(DFP), INTENT(IN) :: xij(:, :) + !! nodal coordinates of element + !! The number of rows in xij should be same as the spatial dimension + !! The number of columns should be same as the number of nodes + !! present in the reference element in geoElemsd. + TYPE(ElemShapeData_), OPTIONAL, INTENT(INOUT) :: geoElemsd + !! shape function data for geometry which contains local shape function + !! data. If not present then the local shape function in elemsd + !! will be used for geometry. This means we are dealing with + !! isoparametric shape functions. + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then the global element is a local element + END SUBROUTINE GetGlobalElemShapeData +END INTERFACE +``` + +## Parameters + +| Parameter | Type | Intent | Description | +| --------------- | ---------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `obj` | `CLASS(FEDOF_)` | `INTENT(INOUT)` | The FEDOF object instance | +| `globalElement` | `INTEGER(I4B)` | `INTENT(IN)` | The global element number for which to compute shape function data | +| `elemsd` | `TYPE(ElemshapeData_)` | `INTENT(INOUT)` | Output variable that will contain the global element shape data | +| `xij` | `REAL(DFP)` | `INTENT(IN)` | Nodal coordinates of the element. The number of rows in `xij` should match the spatial dimension, and the number of columns should match the number of nodes in the reference element | +| `geoElemsd` | `TYPE(ElemShapeData_)` | `OPTIONAL, INTENT(INOUT)` | Shape function data for geometry which contains local shape function data. If not present, the local shape function in `elemsd` will be used for geometry (isoparametric case) | +| `islocal` | `LOGICAL(LGT)` | `OPTIONAL, INTENT(IN)` | If true, `globalElement` is treated as a local element number rather than a global element number | + +## Implementation Details + +The method performs the following operations: + +1. Obtains the element topology index for the specified element +2. Performs error checking in debug mode to ensure the element topology index is valid and the finite element pointer is associated +3. Delegates the actual computation to the appropriate finite element object's `GetGlobalElemShapeData` method + +## Usage Example + +```fortran +TYPE(FEDOF_) :: myFEDOF +TYPE(ElemshapeData_) :: elemsd +REAL(DFP), ALLOCATABLE :: xij(:, :) +INTEGER(I4B) :: elemNum + +! Initialize myFEDOF and prepare xij with nodal coordinates +! ... + +! Get the global element shape data +CALL myFEDOF%GetGlobalElemShapeData(globalElement=elemNum, elemsd=elemsd, xij=xij) + +! Now elemsd contains the shape functions and derivatives in the global coordinate system +``` + +## Notes + +- This method is part of the core functionality for finite element computations, as it provides the necessary information for evaluating functions and their derivatives in the global coordinate system. +- The transformation from local to global coordinates is handled internally by the finite element implementation. +- If `geoElemsd` is not provided, the method will use an isoparametric formulation where the same shape functions are used for both the solution field and the geometry. +- Debug mode provides additional error checking to ensure the element topology index is valid and required pointers are associated. + +Would you like additional information or clarification about any aspect of this method? + +## Example 1 + +import EXAMPLE65 from "./examples/_GetLocalElemshapeData_test_1.md"; + + + +## Example 2 + +import EXAMPLE66 from "./examples/_GetLocalElemshapeData_test_2.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetLocalElemShapeData.md b/docs/docs-api/OneDimFEDOF/GetLocalElemShapeData.md new file mode 100644 index 00000000..9821079c --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetLocalElemShapeData.md @@ -0,0 +1,73 @@ +# GetLocalElemShapeData + +The `GetLocalElemShapeData` method retrieves local element shape function data for a specific element in a finite element mesh. This method acts as a dispatcher that calls the appropriate shape function evaluation method based on the continuity and interpolation type of the finite element space. + +## Syntax + +```fortran +CALL obj%GetLocalElemShapeData(globalElement, elemsd, quad, islocal) +``` + +## Arguments + +| Argument | Intent | Description | +| --------------- | ---------------- | ---------------------------------------------------------------------------- | +| `obj` | `INOUT` | An instance of the `FEDOF_` class | +| `globalElement` | `IN` | Global element number (or local element number if `islocal=.TRUE.`) | +| `elemsd` | `INOUT` | `ElemShapedata_` object to store the shape function data | +| `quad` | `IN` | `QuadraturePoint_` object containing quadrature points | +| `islocal` | `IN`, `OPTIONAL` | Logical flag - if true, `globalElement` is treated as a local element number | + +## Description + +This method determines the appropriate shape function evaluation strategy based on the case name derived from the basis continuity and interpolation type. Currently, it supports: + +- `H1LAGR`: H1-conforming Lagrange interpolation +- `H1HIER`: H1-conforming Hierarchical interpolation + +The method dispatches to the appropriate specialized method: + +- `GetLocalElemShapeDataH1Lagrange` for Lagrange interpolation +- `GetLocalElemShapeDataH1Hierarchical` for Hierarchical interpolation + +## Implementation Details + +The method performs the following steps: + +1. Obtains the case name by calling `obj%GetCaseName()` +2. Uses a SELECT CASE statement to call the appropriate specialized method +3. Raises an error if no matching case is found + +## Example Usage + +```fortran +TYPE(FEDOF_) :: fedof +TYPE(ElemShapedata_) :: elemsd +TYPE(QuadraturePoint_) :: quad +INTEGER :: elemNumber + +! Initialize fedof, elemsd, quad, and elemNumber + +! Get local element shape data +CALL fedof%GetLocalElemShapeData(globalElement=elemNumber, elemsd=elemsd, quad=quad) +``` + +## Notes + +- The method depends on the continuity and interpolation type settings in the FEDOF object +- Error checking is performed in debug mode to ensure the element is valid +- This method serves as a high-level interface to different shape function implementations + +Would you like me to explain any specific part of this method in more detail? + +## Example 1 + +import EXAMPLE65 from "./examples/_GetLocalElemshapeData_test_1.md"; + + + +## Example 2 + +import EXAMPLE66 from "./examples/_GetLocalElemshapeData_test_2.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetMaxTotalConnectivity.md b/docs/docs-api/OneDimFEDOF/GetMaxTotalConnectivity.md new file mode 100644 index 00000000..86cec00b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetMaxTotalConnectivity.md @@ -0,0 +1,79 @@ +# GetMaxTotalConnectivity + +## Interface + +```fortran +MODULE FUNCTION obj_GetMaxTotalConnectivity(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B) :: ans +END FUNCTION obj_GetMaxTotalConnectivity +``` + +## Description + +The `GetMaxTotalConnectivity` method determines the maximum number of degrees of freedom (DOF) associated with any single element in the mesh. This value represents the largest connectivity array size needed to store all DOFs for any element, which is crucial for pre-allocating arrays in finite element assembly operations. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `INTEGER(I4B)`, maximum connectivity size across all elements + +### Implementation Details + +The implementation iterates through all elements in the mesh, calculates the total DOF for each element, and keeps track of the maximum value: + +```fortran +ans = 0 +telems = obj%mesh%GetTotalElements() + +DO ii = 1, telems + tdof = obj%GetTotalDOF(globalElement=ii, isLocal=.TRUE.) + ans = MAX(ans, tdof) +END DO +``` + +This efficient approach ensures that the returned value is large enough to accommodate the connectivity of any element in the mesh. + +## Usage Example + +```fortran +! Example to get the maximum connectivity size +INTEGER(I4B) :: maxConnSize +TYPE(FEDOF_) :: myDOF + +! Get maximum connectivity size +maxConnSize = myDOF%GetMaxTotalConnectivity() + +! Use this value to allocate arrays for element operations +INTEGER(I4B), ALLOCATABLE :: elemDOFs(:) +ALLOCATE (elemDOFs(maxConnSize)) + +! Now elemDOFs is guaranteed to be large enough for any element +! in the mesh, regardless of element type or polynomial order +``` + +## Important Notes + +1. This method is particularly valuable in heterogeneous meshes where different element types or polynomial orders are used +2. The returned value is often cached in the `maxTotalConnectivity` member variable to avoid recalculation +3. This method can be computationally expensive for large meshes as it loops through all elements + +## Related Methods + +- `GetTotalDOF` - Used internally to calculate the DOF count for each element +- `GetConnectivity` - Returns the actual connectivity for a specific element +- `GetConnectivity_` - Lower-level method for retrieving element connectivity + +The `GetMaxTotalConnectivity` method is an important utility function for memory management in finite element codes, ensuring that sufficient memory is allocated for element-wise operations without excessive over-allocation. + +## Example 1 + +import EXAMPLE71 from "./examples/_GetMaxTotalConnectivity_test_1.md"; + + + +## Example 2 + +import EXAMPLE72 from "./examples/_GetMaxTotalConnectivity_test_2.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetMeshPointer.md b/docs/docs-api/OneDimFEDOF/GetMeshPointer.md new file mode 100644 index 00000000..069dec23 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetMeshPointer.md @@ -0,0 +1,52 @@ +# GetMeshPointer + +## Interface + +```fortran +MODULE FUNCTION obj_GetMeshPointer(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CLASS(AbstractMesh_), POINTER :: ans +END FUNCTION obj_GetMeshPointer +``` + +## Description + +The `GetMeshPointer` method returns a pointer to the mesh object associated with the FEDOF (Finite Element Degrees of Freedom) instance. This method provides access to the underlying mesh structure without transferring ownership. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `ans` - Output, `CLASS(AbstractMesh_), POINTER`, pointer to the mesh object + +This allows client code to access the mesh for further operations without needing to duplicate the mesh data. + +## Usage Example + +```fortran +! Example to get the mesh pointer +CLASS(AbstractMesh_), POINTER :: meshPtr +TYPE(FEDOF_) :: myDOF + +! Get the mesh pointer +meshPtr => myDOF%GetMeshPointer() + +! Now use the mesh pointer for operations +IF (ASSOCIATED(meshPtr)) THEN + numElements = meshPtr%GetTotalElements() + ! Other mesh operations... +END IF +``` + +## Important Notes + +1. The returned pointer should not be deallocated by the caller, as the FEDOF object maintains ownership of the mesh. +2. The pointer becomes invalid if the parent FEDOF object is deallocated. +3. This is a read-only operation that doesn't modify the FEDOF object (hence the `INTENT(IN)` for `obj`). + +## Related Methods + +- `GetConnectivity` - Uses the mesh to retrieve element connectivity +- `GetTotalDOF` - Often uses mesh information to calculate DOF counts +- `GetOrders` - Requires mesh information to map between local and global entities + +The `GetMeshPointer` method is useful when operations need direct access to the underlying mesh structure for topological or geometric queries that the FEDOF object doesn't directly expose. diff --git a/docs/docs-api/OneDimFEDOF/GetOrders.md b/docs/docs-api/OneDimFEDOF/GetOrders.md new file mode 100644 index 00000000..1e9fb5e8 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetOrders.md @@ -0,0 +1,125 @@ +# GetOrders + +The `GetOrders` method retrieves the cell order, face order, edge order, and their respective orientation information for a specified element in a finite element mesh. This method is part of the `FEDOF_` class which appears to handle Finite Element Degrees of Freedom. + +## Interface + +```fortran +MODULE SUBROUTINE GetOrders(obj, cellOrder, faceOrder, edgeOrder, cellOrient, + faceOrient, edgeOrient, tCellOrder, tFaceOrder, + tEdgeOrder, tCellOrient, tFaceOrient, tEdgeOrient, + globalElement, islocal) +``` + +## Parameters + +### Input Parameters + +- `obj` : `CLASS(FEDOF_), INTENT(IN)` + - The FEDOF object instance containing the finite element discretization information. + +- `globalElement` : `INTEGER(I4B), INTENT(IN)` + - The global or local element number for which order information is requested. + +- `islocal` : `LOGICAL(LGT), OPTIONAL, INTENT(IN)` + - If present and true, indicates that `globalElement` is a local element number. + - If omitted or false, `globalElement` is treated as a global element number. + +### Output/Inout Parameters + +- `cellOrder` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store the cell order information. + - Size should be at least 1. + +- `faceOrder` : `INTEGER(I4B), INTENT(INOUT)(:,:)` + - 2D array to store face order information. + - First dimension (rows) should be 3. + - Second dimension (columns) should be at least equal to the total number of faces in the element. + +- `edgeOrder` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store edge order information. + - Size should be at least equal to the total number of edges in the element. + +- `cellOrient` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store cell orientation information. + - Size should be at least 1. + +- `faceOrient` : `INTEGER(I4B), INTENT(INOUT)(:,:)` + - 2D array to store face orientation flags. + - First dimension (rows) should be 3. + - Second dimension (columns) should be at least equal to the total number of faces. + +- `edgeOrient` : `INTEGER(I4B), INTENT(INOUT)(:)` + - Array to store edge orientation flags. + - Size should be at least equal to the total number of edges. + +- `tCellOrder` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `cellOrder`. + +- `tFaceOrder` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `faceOrder` (number of faces). + +- `tEdgeOrder` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `edgeOrder` (number of edges). + +- `tCellOrient` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `cellOrient`. + +- `tFaceOrient` : `INTEGER(I4B), INTENT(OUT)(2)` + - Returns the size of data written in `faceOrient`. + +- `tEdgeOrient` : `INTEGER(I4B), INTENT(OUT)` + - Returns the size of data written in `edgeOrient`. + +## Description + +The `GetOrders` method retrieves polynomial order information and orientation flags for a specified element in the finite element mesh. This includes: + +1. The polynomial order of the cell (element) +2. The polynomial orders of all faces of the element +3. The polynomial orders of all edges of the element +4. The orientation flags for the cell, faces, and edges + +The method first converts the global element number to a local element number if needed, then retrieves the connectivity information of the element from the underlying mesh. This connectivity information is used to index into the stored order and orientation data for the element, faces, and edges. + +For face orders, the method copies the same order value to all three components (rows 1-3) of the corresponding face. + +The orientation information is retrieved separately from the mesh using its `GetOrientation` method. + +## Return Values + +This subroutine does not return a value directly but fills the provided arrays with the requested information and returns the sizes of the filled data through the `tCellOrder`, `tFaceOrder`, `tEdgeOrder`, `tCellOrient`, `tFaceOrient`, and `tEdgeOrient` parameters. + +## Implementation Details + +1. Converts global element number to local if needed +2. Retrieves element connectivity information from the mesh +3. Extracts cell order for the specified element +4. Extracts face orders for all faces of the element +5. Extracts edge orders for all edges of the element +6. Retrieves orientation information for the cell, faces, and edges + +## Usage Example + +```fortran +! Assuming obj is an initialized FEDOF_ object +INTEGER(I4B) :: cellOrder(1), faceOrder(3, 6), edgeOrder(12) +INTEGER(I4B) :: cellOrient(1), faceOrient(3, 6), edgeOrient(12) +INTEGER(I4B) :: tCellOrder, tFaceOrder, tEdgeOrder +INTEGER(I4B) :: tCellOrient, tFaceOrient(2), tEdgeOrient +INTEGER(I4B) :: elemID = 5 +LOGICAL(LGT) :: isLocal = .FALSE. + +! Get orders and orientations for element 5 (global numbering) +CALL obj%GetOrders(cellOrder, faceOrder, edgeOrder, & + cellOrient, faceOrient, edgeOrient, & + tCellOrder, tFaceOrder, tEdgeOrder, & + tCellOrient, tFaceOrient, tEdgeOrient, & + elemID, isLocal) +``` + +## Notes + +- The method assumes that the underlying mesh structure has been properly initialized. +- The arrays passed to this method should be pre-allocated with sufficient size to hold the data. +- Face order is replicated across all three rows of the `faceOrder` array for each face. diff --git a/docs/docs-api/OneDimFEDOF/GetPrefix.md b/docs/docs-api/OneDimFEDOF/GetPrefix.md new file mode 100644 index 00000000..73ddbdfd --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetPrefix.md @@ -0,0 +1,14 @@ +# GetPrefix + +Returns the prefix used for setting data in FEDOF. + +## Interface + +```fortran +INTERFACE + MODULE FUNCTION GetPrefix(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + CHARACTER(:), ALLOCATABLE :: ans + END FUNCTION GetPrefix +END INTERFACE +``` diff --git a/docs/docs-api/OneDimFEDOF/GetQuadraturePoints.md b/docs/docs-api/OneDimFEDOF/GetQuadraturePoints.md new file mode 100644 index 00000000..15923de3 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetQuadraturePoints.md @@ -0,0 +1,169 @@ +# GetQuadraturePoints + +The `GetQuadraturePoints` method generates quadrature points for numerical integration over a finite element. + +## Interface 1 + +```fortran +MODULE SUBROUTINE obj_GetQuadraturePoints1(obj, quad, globalElement, & + quadratureType, order, alpha, beta, lambda, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! fedof object + TYPE(QuadraturePoint_), INTENT(INOUT) :: quad + !! quadrature points + INTEGER(I4B), INTENT(IN) :: globalElement + !! global element number + INTEGER(I4B), INTENT(IN) :: quadratureType + !! Type of quadrature points + !! GaussLegendre ! GaussLegendreLobatto + !! GaussLegendreRadau, GaussLegendreRadauLeft + !! GaussLegendreRadauRight ! GaussChebyshev + !! GaussChebyshevLobatto ! GaussChebyshevRadau, GaussChebyshevRadauLeft + !! GaussChebyshevRadauRight + INTEGER(I4B), INTENT(IN) :: order + !! Order of integrand + !! either the order or the nips should be present + !! Both nips and order should not be present + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha + !! Jacobi parameter + REAL(DFP), OPTIONAL, INTENT(IN) :: beta + !! Jacobi parameter + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda + !! Ultraspherical parameter + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then global element is local element +END SUBROUTINE obj_GetQuadraturePoints1 +``` + +## Interface 2 + +```fortran +MODULE SUBROUTINE obj_GetQuadraturePoints2(obj, quad, globalElement, & + p, q, r, quadratureType1, quadratureType2, quadratureType3, alpha1, & + beta1, lambda1, alpha2, beta2, lambda2, alpha3, beta3, lambda3, islocal) + CLASS(FEDOF_), INTENT(INOUT) :: obj + !! abstract finite element + TYPE(QuadraturePoint_), INTENT(INOUT) :: quad + !! quadrature point + INTEGER(I4B), INTENT(IN) :: globalElement + !! global element number + INTEGER(I4B), INTENT(IN) :: p + !! order of integrand in x + INTEGER(I4B), INTENT(IN) :: q + !! order of integrand in y + INTEGER(I4B), INTENT(IN) :: r + !! order of integrand in z direction + INTEGER(I4B), INTENT(IN) :: quadratureType1 + !! Type of quadrature points ! GaussLegendre ! GaussLegendreLobatto + !! GaussLegendreRadau ! GaussLegendreRadauLeft ! GaussLegendreRadauRight + !! GaussChebyshev ! GaussChebyshevLobatto ! GaussChebyshevRadau + !! GaussChebyshevRadauLeft ! GaussChebyshevRadauRight + INTEGER(I4B), INTENT(IN) :: quadratureType2 + !! Type of quadrature points + INTEGER(I4B), INTENT(IN) :: quadratureType3 + !! Type of quadrature points + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha1, beta1, lambda1 + !! Jacobi parameter and Ultraspherical parameters + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha2, beta2, lambda2 + !! Jacobi parameter and Ultraspherical parameters + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha3, beta3, lambda3 + !! Jacobi parameter and Ultraspherical parameters + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if true then the global element is local element +END SUBROUTINE obj_GetQuadraturePoints2 +``` + +## Description + +The `GetQuadraturePoints` method generates quadrature points for numerical integration over a finite element. It provides two variants: + +1. `GetQuadraturePoints1` - For isotropic integration (same order in all directions) +2. `GetQuadraturePoints2` - For anisotropic integration (different orders in different directions) + +These quadrature points are essential for accurately evaluating integrals in the finite element formulation. + +### Parameters for GetQuadraturePoints1 (Isotropic) + +- `obj` - Input/Output, `CLASS(FEDOF_)`, FEDOF object instance +- `quad` - Output, `TYPE(QuadraturePoint_)`, quadrature points object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `quadratureType` - Input, `INTEGER(I4B)`, type of quadrature rule (Gauss-Legendre, Gauss-Chebyshev, etc.) +- `order` - Input, `INTEGER(I4B)`, polynomial order of the integrand +- `alpha`, `beta` - Optional Input, `REAL(DFP)`, Jacobi polynomial parameters +- `lambda` - Optional Input, `REAL(DFP)`, Ultraspherical polynomial parameter +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Parameters for GetQuadraturePoints2 (Anisotropic) + +- `obj` - Input/Output, `CLASS(FEDOF_)`, FEDOF object instance +- `quad` - Output, `TYPE(QuadraturePoint_)`, quadrature points object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `p`, `q`, `r` - Input, `INTEGER(I4B)`, polynomial orders in x, y, and z directions +- `quadratureType1`, `quadratureType2`, `quadratureType3` - Input, `INTEGER(I4B)`, quadrature rule types for each direction +- `alpha1`, `beta1`, `lambda1`, etc. - Optional Input, `REAL(DFP)`, polynomial parameters for each direction +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element number + +### Implementation Details + +Both methods determine the element topology and delegate to the appropriate finite element object: + +```fortran +ii = obj%mesh%GetElemTopologyIndx(globalElement=globalElement, islocal=islocal) + +CALL obj%fe(ii)%ptr%GetQuadraturePoints(quad=quad, order=order, +quadratureType = quadratureType, alpha = alpha, beta = beta, lambda = lambda) +``` + +For the anisotropic version: + +```fortran +CALL obj%fe(ii)%ptr%GetQuadraturePoints(quad=quad, p=p, q=q, r=r, +quadratureType1 = quadratureType1, quadratureType2 = quadratureType2, +quadratureType3 = quadratureType3, alpha1 = alpha1, beta1 = beta1, +lambda1 = lambda1, alpha2 = alpha2, beta2 = beta2, lambda2 = lambda2, +alpha3 = alpha3, beta3 = beta3, lambda3 = lambda3) +``` + +## Usage Example + +```fortran +! Example to get quadrature points for numerical integration +USE QuadraturePoint_Class +TYPE(QuadraturePoint_) :: myQuad +TYPE(FEDOF_) :: myDOF + +! Isotropic quadrature (same order in all directions) +CALL myDOF%GetQuadraturePoints(quad=myQuad, globalElement=5, & + quadratureType=GaussLegendre, order=4) + +! Anisotropic quadrature (different orders in different directions) +CALL myDOF%GetQuadraturePoints(quad=myQuad, globalElement=5, & + p=4, q=3, r=2, & + quadratureType1=GaussLegendre, & + quadratureType2=GaussLegendre, & + quadratureType3=GaussLegendre) + +! Now use myQuad for numerical integration +! ... +``` + +## Important Notes + +1. The `quadratureType` parameters should use predefined constants for different quadrature rules +2. The order should typically be at least twice the polynomial order of the element for accurate integration +3. Special parameters (alpha, beta, lambda) allow customization of certain quadrature rules +4. Different element types (triangles, tetrahedra, etc.) require appropriate quadrature rule selections + +## Related Methods + +- `GetLocalElemShapeData` - Uses quadrature points to evaluate shape functions +- `GetGlobalElemShapeData` - Maps quadrature points to the global coordinate system +- `GetCellOrder` - Can be used to determine appropriate integration order + +The `GetQuadraturePoints` method is a fundamental component of finite element analysis, providing the integration points and weights necessary for accurately evaluating weak form integrals in the finite element method. + +## Example 1 + +import EXAMPLE163 from "./examples/_GetQuadraturePoints_test_1.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetTotalCellDOF.md b/docs/docs-api/OneDimFEDOF/GetTotalCellDOF.md new file mode 100644 index 00000000..133d47d5 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetTotalCellDOF.md @@ -0,0 +1,77 @@ +# GetTotalCellDOF + +The `GetTotalCellDOF` method in the `FEDOF_Class` provides the total number of degrees of freedom (DOF) associated with a cell in a finite element mesh. + +## Interface + +From the `FEDOF_Class.F90` file, the `GetTotalCellDOF` method has the following interface: + +```fortran +PROCEDURE, PUBLIC, PASS(obj) :: GetTotalCellDOF => obj_GetTotalCellDOF +!! Get total cell degrees of freedom +``` + +The specific interface is defined as: + +```fortran +MODULE FUNCTION obj_GetTotalCellDOF(obj, globalCell, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalCell + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalCellDOF +``` + +## Description + +The `GetTotalCellDOF` method calculates the total number of degrees of freedom associated with a specific cell (volumetric element) in a finite element mesh. + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalCell` - Input, `INTEGER(I4B)`, global cell number or local cell number (depends on islocal) +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalCell` is treated as a local cell number +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified cell + +### Implementation Details + +The implementation uses the internal cell index array structure to calculate the total DOF count: + +```fortran +INTEGER(I4B) :: jj +jj = obj%mesh%GetLocalElemNumber(globalElement=globalCell, islocal=islocal) +ans = obj%cellIA(jj + 1) - obj%cellIA(jj) +``` + +This efficiently computes the number of DOFs by finding the difference between consecutive indices in the compressed sparse row format that stores the cell degrees of freedom. + +## Usage Example + +```fortran +! Example to get total DOFs on a cell +INTEGER(I4B) :: totalDOFs +TYPE(FEDOF_) :: myDOF + +! Get total DOFs on cell #5 +totalDOFs = myDOF%GetTotalCellDOF(globalCell=5) + +! Get total DOFs using local cell numbering +totalDOFs = myDOF%GetTotalCellDOF(globalCell=2, islocal=.TRUE.) +``` + +## Related Methods + +- `GetCellDOF` - Retrieves the actual DOF indices for a cell +- `GetTotalEdgeDOF` - Gets total DOF count for element edges +- `GetTotalFaceDOF` - Gets total DOF count for element faces +- `GetTotalVertexDOF` - Gets total DOF count for vertices +- `GetTotalDOF` - Gets total DOF count for an entire element or the entire mesh + +These methods together provide a complete interface for accessing and counting degrees of freedom in different components of the finite element mesh hierarchy (vertices, edges, faces, cells). + +## Example 1 + +import EXAMPLE74 from "./examples/_GetTotalCellDOF_test_1.md"; + + + diff --git a/docs/docs-api/OneDimFEDOF/GetTotalDOF.md b/docs/docs-api/OneDimFEDOF/GetTotalDOF.md new file mode 100644 index 00000000..4e729adf --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetTotalDOF.md @@ -0,0 +1,128 @@ +# GetTotalDOF + +These methods provide a comprehensive interface for querying degree of freedom information at different levels of granularity, from global system-wide counts to element-specific and entity-specific counts. + +| Method | Purpose | +| ---------------- | ------------------------------------------------------------------- | +| **GetTotalDOF1** | Returns the total number of degrees of freedom in the entire domain | +| **GetTotalDOF2** | Returns the total number of DOFs for a specific element | +| **GetTotalDOF3** | Returns filtered DOFs for a specific element based on entity type | + +## Interface 1 + +```fortran +MODULE FUNCTION obj_GetTotalDOF1(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalDOF1 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `ans`: Integer result containing the total number of degrees of freedom + +### Functionality + +This method returns the total number of degrees of freedom in the entire FEDOF object. It simply returns the `tdof` field of the object, which represents the global count of all degrees of freedom across the domain. + +## Interface 2 + +```fortran +MODULE FUNCTION obj_GetTotalDOF2(obj, globalElement, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalDOF2 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalElement`: Global element number to retrieve the total DOFs for +- `islocal`: Optional logical flag - if true, globalElement is treated as a local element number +- `ans`: Integer result containing the total number of degrees of freedom for the specified element + +### Functionality + +This method returns the total number of degrees of freedom associated with a specific element. It: + +1. Gets the element data pointer for the specified element +2. Retrieves the total entities (points, edges, faces, cells) for the element +3. Counts vertex node DOFs +4. Adds the DOFs from all edges of the element +5. Adds the DOFs from all faces of the element +6. Adds the DOFs from the cell itself +7. Returns the total sum as the result + +## Interface 3 + +```fortran +MODULE FUNCTION obj_GetTotalDOF3(obj, globalElement, opt, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local element number + CHARACTER(*), INTENT(IN) :: opt + !! opt for Vertex, Edge, Face, Cell, and All + !! opt = Vertex + !! opt = Edge + !! opt = Face + !! opt = Cell + !! opt = All + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! if islocal true then globalElement is local element number + INTEGER(I4B) :: ans + !! Total number of dof in the FEDOF with opt filter +END FUNCTION obj_GetTotalDOF3 +``` + +### Parameters + +- `obj`: The FEDOF_ object +- `globalElement`: Global element number to retrieve the total DOFs for +- `opt`: Filter option specifying which type of DOFs to count + - "Vertex" or "V" - Only count vertex DOFs + - "Edge" or "E" - Only count edge DOFs + - "Face" or "F" - Only count face DOFs + - "Cell" or "C" - Only count cell DOFs + - Any other value - Count all DOFs (same as GetTotalDOF2) +- `islocal`: Optional logical flag - if true, globalElement is treated as a local element number +- `ans`: Integer result containing the filtered total of degrees of freedom + +### Functionality + +This method is similar to GetTotalDOF2 but allows filtering the DOF count by entity type. It: + +1. Gets the element data pointer for the specified element +2. Checks the first character of the opt parameter to determine which entity types to include +3. Calls the appropriate internal subroutine(s) to count DOFs for the selected entity types: + - onlyVertex: Counts vertex DOFs + - onlyEdge: Counts edge DOFs + - onlyFace: Counts face DOFs + - onlyCell: Counts cell DOFs +4. Returns the total sum as the result + +## Usage + +The generic `GetTotalDOF` method is fundamental in finite element analysis for: + +- Allocating memory for element matrices and vectors +- Determining the size of local element contributions +- Computing the total size of the global system +- Estimating computational requirements +- Filtering DOFs by entity type for specialized operations + +This flexible interface allows for both global analysis (total DOFs in the system), local element-wise operations (DOFs per element), and entity-specific queries (e.g., only edge DOFs), providing comprehensive flexibility in how degree of freedom information is accessed throughout the finite element code. + +## Example 1 + +import EXAMPLE120 from "./examples/_GetTotalDOF_test_1.md"; + + + +## Example 2 + +import EXAMPLE121 from "./examples/_GetTotalDOF_test_2.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetTotalEdgeDOF.md b/docs/docs-api/OneDimFEDOF/GetTotalEdgeDOF.md new file mode 100644 index 00000000..2e42dd38 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetTotalEdgeDOF.md @@ -0,0 +1,93 @@ +# GetTotalEdgeDOF + +The `GetTotalEdgeDOF` generic method in the `FEDOF_Class` provides the total number of degrees of freedom (DOF) associated with an edge in a finite element mesh. + +## Interface + +```fortran +MODULE FUNCTION obj_GetTotalEdgeDOF1(obj, globalEdge, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalEdge + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalEdgeDOF1 + +MODULE FUNCTION obj_GetTotalEdgeDOF2(obj, globalElement, localEdgeNumber, & + islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local cell element number + INTEGER(I4B), INTENT(IN) :: localEdgeNumber + !! local edge number in global element + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + !! if true then globalElement is local element + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalEdgeDOF2 +``` + +## Description + +The `GetTotalEdgeDOF` generic method provides two implementations to retrieve the total edge DOF count: + +1. `GetTotalEdgeDOF1` - Gets total DOF count directly using a global edge number +2. `GetTotalEdgeDOF2` - Gets total DOF count using a global element number and local edge number within that element + +## Interface 1: GetTotalEdgeDOF1 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalEdge` - Input, `INTEGER(I4B)`, global edge number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalEdge` is treated as a local edge number +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified edge + +### Implementation Details + +The implementation uses the internal edge index array structure to calculate the total DOF count: + +```fortran +ans = obj%edgeIA(globalEdge + 1) - obj%edgeIA(globalEdge) +``` + +## Interface 2: GetTotalEdgeDOF2 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalElement` - Input, `INTEGER(I4B)`, global or local cell element number +- `localEdgeNumber` - Input, `INTEGER(I4B)`, local edge number in global element +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified edge + +### Implementation Details + +This implementation first converts the element and local edge information to a global edge number, then calls the first implementation: + +```fortran +INTEGER(I4B) :: globalEdge +globalEdge = obj%mesh%GetGlobalEdgeNumber(globalElement=globalElement, & + islocal=islocal, localEdgeNumber=localEdgeNumber) +ans = obj%GetTotalEdgeDOF(globalEdge=globalEdge, islocal=islocal) +``` + +## Usage Example + +```fortran +! Example to get total DOFs on an edge +INTEGER(I4B) :: totalDOFs +TYPE(FEDOF_) :: myDOF + +! Method 1: Using global edge number +totalDOFs = myDOF%GetTotalEdgeDOF(globalEdge=8) + +! Method 2: Using element and local edge number +totalDOFs = myDOF%GetTotalEdgeDOF(globalElement=15, localEdgeNumber=3) +``` + +## Related Methods + +- `GetEdgeDOF` - Retrieves the actual DOF indices for an edge +- `GetTotalFaceDOF` - Similar function but for element faces +- `GetTotalDOF` - Gets total DOF count for an entire element or the entire mesh +- `GetTotalVertexDOF` - Gets total DOF count for vertices + diff --git a/docs/docs-api/OneDimFEDOF/GetTotalFaceDOF.md b/docs/docs-api/OneDimFEDOF/GetTotalFaceDOF.md new file mode 100644 index 00000000..2a4d66ba --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetTotalFaceDOF.md @@ -0,0 +1,116 @@ +# GetTotalFaceDOF + +The `GetTotalFaceDOF` generic method in the `FEDOF_Class` provides the total number of degrees of freedom (DOF) associated with a face in a finite element mesh. + +## Interfaces + +From the `FEDOF_Class.F90` file, the `GetTotalFaceDOF` generic method has the following interfaces: + +```fortran +PROCEDURE, PASS(obj) :: GetTotalFaceDOF1 => GetTotalFaceDOF1 +!! Get total face dof +PROCEDURE, PASS(obj) :: GetTotalFaceDOF2 => GetTotalFaceDOF2 +!! Get total face dof from global element and local face number +GENERIC, PUBLIC :: GetTotalFaceDOF => GetTotalFaceDOF1, GetTotalFaceDOF2 +``` + +The specific interfaces are defined as: + +```fortran +MODULE FUNCTION GetTotalFaceDOF1(obj, globalFace, islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalFace + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + INTEGER(I4B) :: ans +END FUNCTION GetTotalFaceDOF1 + +MODULE FUNCTION GetTotalFaceDOF2(obj, globalElement, localFaceNumber, & + islocal) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + !! DOF object + INTEGER(I4B), INTENT(IN) :: globalElement + !! global or local element number + INTEGER(I4B), INTENT(IN) :: localFaceNumber + !! local face number in globall element + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + !! if true then globalElement is local element + INTEGER(I4B) :: ans + !! Total number of degree of freedom on face +END FUNCTION GetTotalFaceDOF2 +``` + +## Description + +The `GetTotalFaceDOF` generic method provides two implementations to retrieve the total face DOF count: + +1. `GetTotalFaceDOF1` - Gets total DOF count directly using a global face number +2. `GetTotalFaceDOF2` - Gets total DOF count using a global element number and local face number within that element + +## Interface 1: GetTotalFaceDOF1 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, FEDOF object instance +- `globalFace` - Input, `INTEGER(I4B)`, global face number +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalFace` is treated as a local face number +- `ans` - Output, `INTEGER(I4B)`, total number of DOFs on the specified face + +### Implementation Details + +The implementation uses the internal face index array structure to calculate the total DOF count: + +```fortran +ans = obj%faceIA(globalface + 1) - obj%faceIA(globalface) +``` + +This efficiently computes the number of DOFs by finding the difference between consecutive indices in the compressed sparse row format. + +## Interface 2: GetTotalFaceDOF2 + +### Parameters + +- `obj` - Input, `CLASS(FEDOF_)`, DOF object +- `globalElement` - Input, `INTEGER(I4B)`, global or local element number +- `localFaceNumber` - Input, `INTEGER(I4B)`, local face number in global element +- `islocal` - Optional Input, `LOGICAL(LGT)`, if true, `globalElement` is treated as a local element +- `ans` - Output, `INTEGER(I4B)`, total number of degrees of freedom on the specified face + +### Implementation Details + +This implementation first converts the element and local face information to a global face number, then calls the first implementation: + +```fortran +INTEGER(I4B) :: globalFace +globalFace = obj%mesh%GetGlobalFaceNumber(globalElement=globalElement, & + islocal=islocal, localFaceNumber=localFaceNumber) +ans = obj%GetTotalFaceDOF(globalFace=globalFace, islocal=islocal) +``` + +## Usage Example + +```fortran +! Example to get total DOFs on a face +INTEGER(I4B) :: totalDOFs +TYPE(FEDOF_) :: myDOF + +! Method 1: Using global face number +totalDOFs = myDOF%GetTotalFaceDOF(globalFace=3) + +! Method 2: Using element and local face number +totalDOFs = myDOF%GetTotalFaceDOF(globalElement=7, localFaceNumber=2) +``` + +## Related Methods + +- `GetFaceDOF` - Retrieves the actual DOF indices for a face +- `GetTotalEdgeDOF` - Similar function but for element edges +- `GetTotalDOF` - Gets total DOF count for an entire element or the entire mesh +- `GetTotalVertexDOF` - Gets total DOF count for vertices + +These methods are essential for traversing and accessing degrees of freedom in different components of the mesh hierarchy (vertices, edges, faces, cells). + +## Example 1 + +import EXAMPLE115 from "./examples/_GetTotalFaceDOF_test_1.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/GetTotalVertexDOF.md b/docs/docs-api/OneDimFEDOF/GetTotalVertexDOF.md new file mode 100644 index 00000000..91100e2d --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetTotalVertexDOF.md @@ -0,0 +1,72 @@ +# GetTotalVertexDOF + +The `GetTotalVertexDOF` method in the `FEDOF_Class` returns the total number of vertex degrees of freedom (DOFs) in a finite element discretization. In the context of EASIFEM (Expandable And Scalable Infrastructure for Finite Element Methods), vertex DOFs represent the degrees of freedom associated with the vertices/nodes of the mesh. + +## Interface + +```fortran +MODULE FUNCTION obj_GetTotalVertexDOF(obj) RESULT(ans) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B) :: ans +END FUNCTION obj_GetTotalVertexDOF +``` + +## Arguments + +| Argument | Intent | Description | +| -------- | ------ | ----------------------------- | +| `obj` | `IN` | An instance of `FEDOF_` class | + +## Returns + +| Type | Description | +| -------------- | ---------------------------------------------------------------------------------------- | +| `INTEGER(I4B)` | The total number of vertex DOFs, which is equal to the total number of nodes in the mesh | + +## Example Usage + +```fortran +PROGRAM demo +USE GlobalData +USE FEDOF_Class +USE AbstractMesh_Class + +TYPE(FEDOF_) :: dof +CLASS(AbstractMesh_), POINTER :: mesh +INTEGER(I4B) :: totalVertexDOF + +! Initialize mesh and dof objects +! ... + +! Get total vertex DOFs +totalVertexDOF = dof%GetTotalVertexDOF() + +PRINT *, "Total vertex DOFs: ", totalVertexDOF +END PROGRAM +``` + +## Implementation Details + +The implementation of `GetTotalVertexDOF` is straightforward. It returns the value of the `tNodes` member variable of the `FEDOF_` object, which represents the total number of nodes in the mesh: + +```fortran +MODULE PROCEDURE obj_GetTotalVertexDOF +ans = obj%tNodes +END PROCEDURE obj_GetTotalVertexDOF +``` + +This method is particularly useful when you need to know the number of nodal degrees of freedom in the mesh, for example, when allocating arrays or initializing data structures that depend on this count. + +## Notes + +- In many finite element applications, each vertex (node) has at least one degree of freedom. +- The method returns the total number of vertex DOFs regardless of the continuity or conformity of the basis functions used. +- For H1-conforming elements, the vertex DOFs are typically scalar values at each node. +- For vector problems (like elasticity), each vertex may have multiple DOFs (e.g., displacement in x, y, and z directions). + +## See Also + +- `GetTotalDOF`: Returns the total number of DOFs (vertex, edge, face, and cell) in the mesh +- `GetVertexDOF`: Gets the specific DOF IDs associated with a given vertex +- `GetConnectivity`: Gets the DOF connectivity for an element + diff --git a/docs/docs-api/OneDimFEDOF/GetVertexDOF.md b/docs/docs-api/OneDimFEDOF/GetVertexDOF.md new file mode 100644 index 00000000..0ef2e418 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/GetVertexDOF.md @@ -0,0 +1,76 @@ +# GetVertexDOF + +The `GetVertexDOF` method retrieves the degree of freedom (DOF) number associated with a specified vertex (node) in the mesh. In finite element analysis, each vertex in the mesh is typically assigned one or more degrees of freedom, which represent the unknown values to be solved for. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE GetVertexDOF(obj, globalNode, ans, tsize, islocal) + CLASS(FEDOF_), INTENT(IN) :: obj + INTEGER(I4B), INTENT(IN) :: globalNode + INTEGER(I4B), INTENT(INOUT) :: ans(:) + INTEGER(I4B), INTENT(OUT) :: tsize + LOGICAL(LGT), INTENT(IN), OPTIONAL :: islocal + END SUBROUTINE GetVertexDOF +END INTERFACE +``` + +## Parameters + +- `obj` - The `FEDOF_` object containing degree of freedom information +- `globalNode` - The global or local node number, depending on the value of `islocal` +- `ans` - An array that will store the degree of freedom number(s) associated with the specified node +- `tsize` - The number of degrees of freedom written to the `ans` array +- `islocal` - Optional logical flag. If present and `.TRUE.`, `globalNode` is interpreted as a local node number; otherwise, it's a global node number + +## Implementation Details + +The implementation is straightforward for vertex DOFs: + +```fortran +tsize = 1 +ans(1) = obj%mesh%GetLocalNodeNumber(globalNode, islocal=islocal) +``` + +For vertex DOFs in most finite element formulations: + +1. The method sets `tsize` to 1, indicating that one degree of freedom is associated with each vertex +2. It obtains the local node number using the mesh's `GetLocalNodeNumber` method, which converts global node numbers to local ones if necessary +3. The local node number itself is used as the degree of freedom number + +## Notes + +- This method assumes a simple one-to-one mapping between mesh vertices and degrees of freedom, which is typical for scalar problems (e.g., heat conduction, potential flow) +- For vector problems (e.g., elasticity) or higher-order problems, a more complex mapping might be needed, potentially requiring multiple DOFs per vertex +- The implementation reflects that in typical finite element numbering schemes, vertex DOFs are numbered first, followed by edge, face, and cell DOFs +- In the current implementation, the DOF number for a vertex is identical to its local node number in the mesh + +## Example Usage + +This method is typically used when assembling the global system of equations or when mapping local element matrices to the global system: + +```fortran +INTEGER(I4B) :: nodeDOF(1), tsize, nodeNum + +! Get the DOF number for node 5 +nodeNum = 5 +CALL fedof%GetVertexDOF(globalNode=nodeNum, ans=nodeDOF, tsize=tsize) + +! nodeDOF(1) now contains the DOF number for node 5 +! tsize will be 1 +``` + +This method is often called internally by other methods in the `FEDOF_` class, particularly when constructing element connectivity arrays that map local element degrees of freedom to global system degrees of freedom. + +## Example 1 + +import EXAMPLE69 from "./examples/_GetVertexDOF_test_1.md"; + + + +## Example 2 + +import EXAMPLE76 from "./examples/_GetVertexDOF_test_2.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/ImportFromToml.md b/docs/docs-api/OneDimFEDOF/ImportFromToml.md new file mode 100644 index 00000000..759f43b7 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/ImportFromToml.md @@ -0,0 +1,62 @@ +--- +title: ImportFromToml +--- + +This method imports the configuration form a toml file and initiates the FEDOF instance. + +The `ImportFromToml` method has two implementations: + +1. `ImportFromToml1` - Imports configuration from a TOML table that's already loaded +2. `ImportFromToml2` - Imports configuration from a TOML file by name + +## Interface 1 + +In this interface to import the data we specify the toml table and mesh. + +```fortran +INTERFACE FEDOFImportFromToml + MODULE SUBROUTINE ImportFromToml(obj, table, mesh) + CLASS(FEDOF_), INTENT(INOUT) :: obj + TYPE(toml_table), INTENT(INOUT) :: table + CLASS(AbstractMesh_), TARGET, INTENT(IN) :: mesh + END SUBROUTINE ImportFromToml +END INTERFACE FEDOFImportFromToml +``` + +## Interface 2 + +In this interface to import the data we specify the name of the toml file (or provide an instance of TxtFile), name of the key (tomlName), and mesh. + +```fortran +INTERFACE FEDOFImportFromToml + MODULE SUBROUTINE ImportFromToml(obj, tomlName, afile, & + filename, printToml, mesh) + CLASS(FEDOF_), INTENT(INOUT) :: obj + CHARACTER(*), INTENT(IN) :: tomlName + TYPE(TxtFile_), OPTIONAL, INTENT(INOUT) :: afile + CHARACTER(*), OPTIONAL, INTENT(IN) :: filename + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: printToml + CLASS(AbstractMesh_), OPTIONAL, INTENT(IN) :: mesh + END SUBROUTINE ImportFromToml +END INTERFACE FEDOFImportFromToml +``` + +## Template for Import for toml file + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./examples/toml/_ImportFromToml_test_1.toml'; + +{CodeSnippet} + +## Example 1 + +import EXAMPLE47 from "./examples/_ImportFromToml_test_1.md"; + + + +## Example 2 + +import EXAMPLE56 from "./examples/_ImportFromToml_test_2.md"; + + diff --git a/docs/docs-api/OneDimFEDOF/Initiate.md b/docs/docs-api/OneDimFEDOF/Initiate.md new file mode 100644 index 00000000..14545f29 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/Initiate.md @@ -0,0 +1,368 @@ +# Initiate + +This method initiates an instance of `OneDimFEDOF`. There are several ways to initiate an instance of `OneDimFEDOF`. + +The `Initiate` method has four different implementations: + +1. `Initiate1` - Initializes with homogeneous order for all elements +2. `Initiate2` - Initializes with inhomogeneous orders specified per element +3. `Initiate3` - Initializes from a parameter list +4. `Initiate4` - Initializes from an order vector defined for global elements + +## Interface 1 + +This method is for Homogeneous order, that is, all elements in the mesh have the same order. + +```fortran +INTERFACE + MODULE SUBROUTINE Initiate(obj, order, mesh, baseContinuity, & + baseInterpolation, fetype, ipType, basisType, alpha, beta, lambda, & + quadratureType, quadratureOrder, quadratureNips, & + quadratureAlpha, quadratureBeta, quadratureLambda) + CLASS(OneDimFEDOF_), INTENT(INOUT) :: obj + INTEGER(I4B), INTENT(IN) :: order + !! homogeneous value of order + CLASS(OneDimDomain_), TARGET, INTENT(IN) :: mesh + !! cell mesh + CHARACTER(*), INTENT(IN) :: baseContinuity + !! continuity of basis (regularity) + CHARACTER(*), INTENT(IN) :: baseInterpolation + !! basis function used for interpolation + INTEGER(I4B), OPTIONAL, INTENT(IN) :: fetype + !! Finite element type + !! Default is Scalar, (Vector) + !! Read docs of AbstractOneDimFE + INTEGER(I4B), OPTIONAL, INTENT(IN) :: ipType + !! interpolation type + !! Read docs of AbstractOneDimFE + INTEGER(I4B), OPTIONAL, INTENT(IN) :: basisType + !! type of basis function used for constructing the Lagrange polynomial + !! Used when baseInterpolation is Lagrange + !! Read docs of AbstractOneDimFE + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha + !! alpha parameter for jacobian polynomial + !! Read docs of AbstractOneDimFE + REAL(DFP), OPTIONAL, INTENT(IN) :: beta + !! beta parameter for jacobian polynomial + !! Read docs of AbstractOneDimFE + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda + !! lambda parameter for Ultraspherical parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Ultraspherical + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureType + !! Quadrature type + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureOrder + !! Accuracy of quadrature rule + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureNips(1) + !! Number of integration points + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureAlpha + !! Jacobi parameter for quadrature + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureBeta + !! Jacobi parameter for quadrature + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureLambda + !! Ultraspherical parameter for quadrature + END SUBROUTINE Initiate +END INTERFACE +``` + +### Description + +This subroutine configures a OneDimFEDOF object by setting up the basis functions, continuity, and interpolation properties based on a given mesh and order. + +### Parameters + +| Parameter | Type | Intent | Description | +| ------------------- | ---------------------------- | ------ | ----------------------------------------------------------------------- | +| `obj` | CLASS(OneDimFEDOF_) | INOUT | The OneDimFEDOF object to be initialized. | +| `order` | INTEGER(I4B) | IN | Homogeneous polynomial order for the basis functions. | +| `mesh` | CLASS(AbstractMesh_), TARGET | IN | The computational mesh defining the spatial discretization. | +| `baseContinuity` | CHARACTER(*) | IN | Specifies the continuity of basis functions (regularity or conformity). | +| `baseInterpolation` | CHARACTER(*) | IN | Type of basis function used for interpolation. | + +### Optional Parameters + +| Parameter | Type | Intent | Optional | Description | +| ----------- | ------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| `ipType` | INTEGER(I4B) | IN | Yes | Interpolation point type. Used when `baseInterpolation` is set to Lagrange. | +| `basisType` | INTEGER(I4B) | IN | Yes | Array specifying types of basis functions used for constructing Lagrange polynomials. Used when `baseInterpolation` is Lagrange. | +| `alpha` | REAL(DFP) | IN | Yes | Alpha parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `beta` | REAL(DFP) | IN | Yes | Beta parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `lambda` | REAL(DFP) | IN | Yes | Lambda parameters for Ultraspherical polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Ultraspherical. | + +### Usage Example + +```fortran +CALL myOneDimFEDOF%Initiate(order=2, mesh=myMesh, baseContinuity="H1", & + baseInterpolation="Lagrange", ipType=GAUSS_LOBATTO) +``` + +## Interface 2 + +- Here order represents the order of each cell element. +- `order` is a vector of integers, the length of `order` must be equal to the number of elements in the mesh. +- `order(i)` is the order of local element `i`. + +```fortran +INTERFACE + MODULE SUBROUTINE obj_Initiate2(obj, order, mesh, baseContinuity, & + baseInterpolation, fetype, ipType, basisType, alpha, beta, lambda, & + islocal, quadratureType, quadratureOrder, quadratureNips, quadratureAlpha, & + quadratureBeta, quadratureLambda) + CLASS(OneDimFEDOF_), INTENT(INOUT) :: obj + !! Finite degree of freedom object + INTEGER(I4B), INTENT(IN) :: order(:) + !! Inhomogeneous value of order + !! This is order of each cell element + !! see the note on islocal + CLASS(OneDimDomain_), TARGET, INTENT(IN) :: mesh + !! cell mesh + CHARACTER(*), INTENT(IN) :: baseContinuity + !! continuity of basis (regularity) + !! Read the docs of AbstractOneDimFE + CHARACTER(*), INTENT(IN) :: baseInterpolation + !! basis function used for interpolation + !! Read the docs of AbstractOneDimFE + INTEGER(I4B), OPTIONAL, INTENT(IN) :: fetype + !! Finite element type + !! Default is Scalar (Vector) + !! Read docs of AbstractOneDimFE + INTEGER(I4B), OPTIONAL, INTENT(IN) :: ipType + !! interpolation type + !! used when baseInterpolation is Lagrange + INTEGER(I4B), OPTIONAL, INTENT(IN) :: basisType + !! type of basis function used for + !! constructing the Lagrange polynomial + !! Used when baseInterpolation is Lagrange + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha + !! alpha parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi + REAL(DFP), OPTIONAL, INTENT(IN) :: beta + !! beta parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda + !! lambda parameter for Ultraspherical parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Ultraspherical + LOGICAL(LGT), OPTIONAL, INTENT(IN) :: islocal + !! islocal denotes whether the order(:) is based on + !! local element or global element number. + !! local element means in order(ii) ii is the local + !! element number, global element means in order(ii) ii is the + !! global element number. Note that getting local element + !! number is difficult for user, so it is better to use + !! global element number. + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureType + !! Quadrature type + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureOrder + !! Accuracy of quadrature rule + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureNips(1) + !! Number of integration points + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureAlpha + !! Jacobi parameter for quadrature + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureBeta + !! Jacobi parameter for quadrature + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureLambda + !! Ultraspherical parameter for quadrature + END SUBROUTINE obj_Initiate2 +END INTERFACE +``` + +### Description + +This subroutine configures a OneDimFEDOF object using inhomogeneous orders across mesh elements, allowing different polynomial orders for different parts of the domain. + +### Parameters + +| Parameter | Type | Intent | Description | +| ------------------- | ---------------------------- | ------ | -------------------------------------------------------------- | +| `obj` | CLASS(OneDimFEDOF_) | INOUT | The Finite Element Degree of Freedom object to be initialized. | +| `order` | INTEGER(I4B)(:) | IN | Array of polynomial orders for each cell element. | +| `mesh` | CLASS(AbstractMesh_), TARGET | IN | The computational mesh defining the spatial discretization. | +| `baseContinuity` | CHARACTER(*) | IN | Specifies the continuity of basis functions (regularity). | +| `baseInterpolation` | CHARACTER(*) | IN | Type of basis function used for interpolation. | + +### Optional Parameters + +| Parameter | Type | Intent | Description | +| ----------- | --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | +| `ipType` | INTEGER(I4B) | IN | Interpolation point type. Used when `baseInterpolation` is set to Lagrange. | +| `basisType` | INTEGER(I4B)(:) | IN | Array specifying types of basis functions used for constructing Lagrange polynomials. Used when `baseInterpolation` is Lagrange. | +| `alpha` | REAL(DFP)(:) | IN | Alpha parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `beta` | REAL(DFP)(:) | IN | Beta parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `lambda` | REAL(DFP)(:) | IN | Lambda parameters for Ultraspherical polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Ultraspherical. | +| `islocal` | LOGICAL(LGT) | IN | Specifies whether `order` array references local element numbers (TRUE) or global element numbers (FALSE, default). | + +### Usage Example + +```fortran +! Create an array with different orders for different elements +INTEGER(I4B) :: elementOrders(mesh%getTotalElements()) +elementOrders = [1, 2, 2, 3, 2, 1] ! Example orders + +CALL myOneDimFEDOF%Initiate(order=elementOrders, mesh=myMesh, & + baseContinuity="H1", baseInterpolation="Lagrange", & + ipType=GAUSS_LOBATTO, islocal=.FALSE.) +``` + +### Notes + +- The length of the `order` array must match the number of elements in the mesh. +- When `islocal` is not provided or is FALSE, the indices in `order` correspond to global element numbers. +- When `islocal` is TRUE, the indices in `order` correspond to local element numbers, which may be different from global numbering. +- Using global element numbering is generally easier for users to work with. + +## Interface 3 + +- This method is used to initiate `OneDimFEDOF` by using `ParameterList`. + +```fortran +INTERFACE + MODULE SUBROUTINE Initiate(obj, param, mesh) + CLASS(OneDimFEDOF_), INTENT(INOUT) :: obj + !! Fintie degree of freedom object + TYPE(ParameterList_), INTENT(IN) :: param + !! parameter list + CLASS(OneDimDomain_), TARGET, INTENT(IN) :: mesh + !! mesh + END SUBROUTINE Initiate +END INTERFACE +``` + +:::warning WIP +This interface is still under development and may not be fully functional yet. +::: + +## Interface 4 + +- This routine is similar to the Interface 2, but the order of the element is defined for global element numbers. +- This method is more useful for the user who have no idea about the local element number. +- `order` is a two-dimensional array. + - The number of rows in order is equal to 2 + - The first row contains the global element number + - The second row contains the order. + +:::note +This routine will make `order0(:)` from `order(:,:)` and call `Initiate2` method internally. +::: + +```fortran +INTERFACE + MODULE SUBROUTINE Initiate(obj, order, mesh, baseContinuity, & + baseInterpolation, fetype, ipType, basisType, alpha, beta, lambda, & + quadratureType, quadratureOrder, quadratureNips, quadratureAlpha, & + quadratureBeta, quadratureLambda) + CLASS(OneDimFEDOF_), INTENT(INOUT) :: obj + INTEGER(I4B), INTENT(IN) :: order(:, :) + !! The number of columns in order is equal to total number of elements + !! The number of rows in order is equal to 2 + !! The first row contains the global element number + !! the second rows contains the order of that element + CLASS(OneDimDomain_), TARGET, INTENT(IN) :: mesh + !! mesh + CHARACTER(*), INTENT(IN) :: baseContinuity + !! continuity of basis function + !! Read the docs of AbstractOneDimFE + CHARACTER(*), INTENT(IN) :: baseInterpolation + !! interpolation of basis + !! Read the docs of AbstractOneDimFE + INTEGER(I4B), OPTIONAL, INTENT(IN) :: fetype + !! Finite element type + !! Default is Scalar (Vector) + !! Read docs of AbstractOneDimFE + INTEGER(I4B), OPTIONAL, INTENT(IN) :: ipType + !! Interpolation type + !! used when baseInterpolation is Lagrange + !! Read the docs of AbstractOneDimFE + INTEGER(I4B), OPTIONAL, INTENT(IN) :: basisType + !! type of basis function used for + !! constructing the Lagrange polynomial + !! Used when baseInterpolation is Lagrange + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha + !! alpha parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi + REAL(DFP), OPTIONAL, INTENT(IN) :: beta + !! beta parameter for jacobian parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Jacobi + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda + !! lambda parameter for Ultraspherical parameter + !! used when baseInterpolation is Lagrange + !! used when basistype is Ultraspherical + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureType + !! Quadrature type + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureOrder + !! Accuracy of quadrature rule + INTEGER(I4B), OPTIONAL, INTENT(IN) :: quadratureNips(1) + !! Number of integration points + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureAlpha + !! Jacobi parameter for quadrature + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureBeta + !! Jacobi parameter for quadrature + REAL(DFP), OPTIONAL, INTENT(IN) :: quadratureLambda + !! Ultraspherical parameter for quadrature + END SUBROUTINE Initiate +END INTERFACE +``` + +### Parameters + +| Parameter | Type | Intent | Description | +| ------------------- | ---------------------------- | ------ | ------------------------------------------------------------- | +| `obj` | CLASS(OneDimFEDOF_) | INOUT | The OneDimFEDOF object to be initialized. | +| `order` | INTEGER(I4B)(:,:) | IN | 2×N array where N is the number of elements to be configured. | +| `mesh` | CLASS(AbstractMesh_), TARGET | IN | The computational mesh defining the spatial discretization. | +| `baseContinuity` | CHARACTER(*) | IN | Specifies the continuity of basis functions (regularity). | +| `baseInterpolation` | CHARACTER(*) | IN | Type of basis function used for interpolation. | + +### Optional Parameters + +| Parameter | Type | Intent | Description | +| ----------- | --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | +| `ipType` | INTEGER(I4B) | IN | Interpolation point type. Used when `baseInterpolation` is set to Lagrange. | +| `basisType` | INTEGER(I4B)(:) | IN | Array specifying types of basis functions used for constructing Lagrange polynomials. Used when `baseInterpolation` is Lagrange. | +| `alpha` | REAL(DFP)(:) | IN | Alpha parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `beta` | REAL(DFP)(:) | IN | Beta parameters for Jacobi polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Jacobi. | +| `lambda` | REAL(DFP)(:) | IN | Lambda parameters for Ultraspherical polynomials. Required when `baseInterpolation` is Lagrange and `basisType` is Ultraspherical. | + +### Usage Example + +```fortran +! Create a 2×3 array to specify orders for three specific elements +INTEGER(I4B) :: elementOrders(2, 3) +! First row: global element numbers +elementOrders(1, :) = [1, 5, 10] +! Second row: corresponding polynomial orders +elementOrders(2, :) = [2, 3, 1] + +CALL myOneDimFEDOF%Initiate(order=elementOrders, mesh=myMesh, & + baseContinuity="H1", baseInterpolation="Lagrange", & + ipType=GAUSS_LOBATTO) +``` + +### Notes + +- This interface is more user-friendly as it allows specifying orders only for elements of interest using their global numbers. +- Internally, this method constructs a complete order array and calls Interface 2. +- The number of columns in the `order` array can be less than the total number of elements in the mesh - only specified elements will receive custom orders. + +## Example (H1, Lagrange, Uniform Order) + +import EXAMPLE287 from "./examples/_Initiate_test_1.md"; + + + +## Example (H1, Hierarchical, Uniform Order) + +import EXAMPLE295 from "./examples/_Initiate_test_2.md"; + + + +## Example (H1, Hierarchical, Inhomogeneous Order with Local Element Number) + +import EXAMPLE303 from "./examples/_Initiate_test_3.md"; + + + diff --git a/docs/docs-api/OneDimFEDOF/OneDimFEDOF_.md b/docs/docs-api/OneDimFEDOF/OneDimFEDOF_.md new file mode 100644 index 00000000..ca5a8320 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/OneDimFEDOF_.md @@ -0,0 +1,189 @@ +--- +sidebar_position: 2 +--- + +# Structure + +The structure of `FEDOF_` is given below. + +```fortran +TYPE :: FEDOF_ + PRIVATE + LOGICAL(LGT) :: isLagrange = .FALSE. + !! It is true when baseInterpolation is Lagrange + INTEGER(I4B) :: tdof = 0 + !! Total number of degrees of freedom + INTEGER(I4B) :: tNodes = 0 + !! Total number of nodes + INTEGER(I4B) :: tEdges = 0 + !! Total number of edges + INTEGER(I4B) :: tFaces = 0 + !! Total number of faces + INTEGER(I4B) :: tCells = 0 + !! Total number of cells + INTEGER(I4B) :: maxTotalConnectivity = 0 + !! maximum number of connectivity + + CHARACTER(2) :: baseContinuity = "H1" + !! continuity or conformity of basis defined on reference + !! element, following values are allowed + !! H1, HCurl, HDiv, DG + + CHARACTER(4) :: baseInterpolation = "LAGR" + !! Type of basis functions used for interpolation on reference + !! element, Following values are allowed + !! LagrangeInterpolation ! HierarchyInterpolation + !! OrthogonalInterpolation ! HermitInterpolation + !! SerendipityInterpolation + + INTEGER(INT8) :: maxCellOrder = 0_INT8 + !! maximum value of cell order + + INTEGER(INT8) :: maxFaceOrder = 0_INT8 + !! maximum value of face order + + INTEGER(INT8) :: maxEdgeOrder = 0_INT8 + !! maximum value of edge order + + INTEGER(INT8), ALLOCATABLE :: cellOrder(:) + !! Order of each cell + !! the size of cellOrder is equal to the obj%tCells + !! Get connectivity of an element + !! Get entity number of an element + !! Get the cell number of an element (this is global element number) + !! convert it to the local element number + !! use this local element number to get cell order from cellOrder + + INTEGER(INT8), ALLOCATABLE :: faceOrder(:) + !! order of each face + + INTEGER(INT8), ALLOCATABLE :: edgeOrder(:) + !! order of each edge + + INTEGER(I4B), ALLOCATABLE :: edgeIA(:) + !! sparsity for edge, the size of edgeJA is equal to the total number of + !! degrees of freedom on edge, + !! the size of edgeIA is equal to the total number of edges + 1 + !! The degrees of freedom of iedge is stored in + !! edgeJA(edgeIA(iedge):edgeIA(iedge+1)-1) + + INTEGER(I4B), ALLOCATABLE :: faceIA(:) + !! sparsity for face, the size of faceJA is equal to the total number of + !! degrees of freedom on face, + !! the size of faceIA is equal to the total number of faces + 1 + !! The degrees of freedom of iface is stored in + !! faceJA(faceIA(iface):faceIA(iface+1)-1) + + INTEGER(I4B), ALLOCATABLE :: cellIA(:) + !! sparsity for cell, the size of cellJA is equal to the total number of + !! degrees of freedom on cell, + !! the size of cellIA is equal to the total number of cells + 1 + !! The degrees of freedom of icell is stored in + !! cellJA(cellIA(icell):cellIA(icell+1)-1) + + TYPE(AbstractFEPointer_) :: fe(8) + !! pointer to finite element object + !! point, line, triangle, quadrangle, tetrahedron, hexahedron, prism, + !! pyramid + + CLASS(AbstractMesh_), POINTER :: mesh => NULL() + !! Pointer to domain +END TYPE FEDOF_ +``` + +### `isLagrange` + +It is true when `baseInterpolation` is Lagrange + +### `tdof` + +Total number of degrees of freedom in FEDOF object. + +### `tNodes` + +Total number of nodes in mesh. + +### `tEdges` + +Total number of edges in mesh. + +### `tFaces` + +Total number of faces in mesh. + +### `tCells` + +Total number of cells in mesh. + +### `maxTotalConnectivity` + +Maximum number of connectivity. + +### `baseContinuity` + +Continuity or conformity of basis defined on reference element, following values are allowed + +- H1 +- HCurl +- HDiv +- DG + +### `baseInterpolation` + +Type of basis functions used for interpolation on reference element, Following values are allowed + +- LagrangeInterpolation +- HierarchyInterpolation +- OrthogonalInterpolation +- HermitInterpolation +- SerendipityInterpolation + +### `maxCellOrder` + +Maximum value of cell order. + +### `maxFaceOrder` + +Maximum value of face order. + +### `maxEdgeOrder` + +Maximum value of edge order. + +### `cellOrder` + +Order of each cell. The size of `cellOrder` is equal to the `obj%tCells`. + +The process is as follows: + +- Get connectivity of an element. +- Get entity number of an element. +- Get the cell number of an element (this is global element number) convert it to the local element number use this local element number to get cell order from `cellOrder` + +### `faceOrder` + +Order of each face. + +### `edgeOrder` + +Order of each edge. + +### `edgeIA` + +Sparsity for edge, the size of `edgeJA` is equal to the total number of degrees of freedom on edge, the size of `edgeIA` is equal to the total number of `edges + 1`. The degrees of freedom of `iedge` is stored in `edgeJA(edgeIA(iedge)):edgeIA(iedge+1)-1))`. + +### `faceIA` + +Sparsity for face. The size of `faceIA` is equal to the total number of degrees of freedom on face, the size of `faceIA` is equal to the total number of `faces + 1`. The degrees of freedom of `iface` is stored in `faceJA(faceIA(iface):faceIA(iface+1)-1)`. + +### `cellIA` + +Sparsity for cell. The size of `cellIA` is equal to the total number of degrees of freedom on cell. The size of `cellIA` is equal to the total number of `cells + 1`. The degrees of freedom of `icell` is stored in `cellJA(cellIA(icell)):cellIA(icell+1)-1))`. + +### `fe` + +Pointer to finite element object point, line, triangle, quadrangle, tetrahedron, hexahedron, prism, pyramid. + +### `mesh` + +Pointer to domain. diff --git a/docs/docs-api/OneDimFEDOF/SetFEDOFParam.md b/docs/docs-api/OneDimFEDOF/SetFEDOFParam.md new file mode 100644 index 00000000..70d655cb --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/SetFEDOFParam.md @@ -0,0 +1,43 @@ +--- +sidebar_position: 3 +--- + +# SetFEDOFParam + +Set the parameters of the finite element degree of freedom. + +## Interface + +```fortran +INTERFACE + MODULE SUBROUTINE SetFEDOFParam(param, baseContinuity, baseInterpolation, & + orderFile, ipType, basisType, alpha, beta, lambda) + TYPE(ParameterList_), INTENT(INOUT) :: param + CHARACTER(*), INTENT(IN) :: baseContinuity + !! continuity or conformity of basis defined on reference + CHARACTER(*), INTENT(IN) :: baseInterpolation + !! Type of basis functions used for interpolation on reference + CHARACTER(*), INTENT(IN) :: orderFile + !! file containing the order of each element + INTEGER(I4B), OPTIONAL, INTENT(IN) :: ipType + !! interpolation point type + INTEGER(I4B), OPTIONAL, INTENT(IN) :: basisType(:) + !! basis type, in x, y, and z direction + REAL(DFP), OPTIONAL, INTENT(IN) :: alpha(:) + !! jacobian parameter in x, y, and z direction + REAL(DFP), OPTIONAL, INTENT(IN) :: beta(:) + !! jacobian parameter in x, y, and z direction + REAL(DFP), OPTIONAL, INTENT(IN) :: lambda(:) + !! ultraspherical parameter in x, y, and z direction + END SUBROUTINE SetFEDOFParam +END INTERFACE +``` + +- `baseContinuity` is the continuity or conformity of the basis +- `baseInterpolation` denotes interpolation of the basis type +- `orderFile` file containing the order of each element +- `ipType` is the interpolation point type. It is needed in the case of Lagrange polynomials. +- `basisType` is the type of basis function in x, y, and z directions. +- `alpha` is the Jacobian parameter in x, y, and z directions. +- `beta` is the Jacobian parameter in x, y, and z directions. +- `lambda` is the Ultraspherical parameter in x, y, and z directions. diff --git a/docs/docs-api/OneDimFEDOF/SetSparsity.md b/docs/docs-api/OneDimFEDOF/SetSparsity.md new file mode 100644 index 00000000..de07682f --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/SetSparsity.md @@ -0,0 +1,118 @@ +# SetSparsity + +The `SetSparsity` method is used to establish the sparsity pattern in a CSR (Compressed Sparse Row) matrix based on finite element degrees of freedom (FEDOF). This is a crucial operation for efficiently assembling and storing finite element matrices. The method offers two implementations to handle different sparsity pattern generation scenarios. + +## Interface 1 + +> Single FEDOF Sparsity Pattern + +```fortran +MODULE SUBROUTINE SetSparsity1(obj, mat) + CLASS(FEDOF_), INTENT(INOUT) :: obj + TYPE(CSRMatrix_), INTENT(INOUT) :: mat +END SUBROUTINE SetSparsity1 +``` + +### Purpose + +Creates a sparsity pattern in a CSR matrix using a single FEDOF object. This implementation is typically used for matrices representing operations within a single finite element space (like mass or stiffness matrices). + +### Parameters + +- `obj`: The FEDOF object that contains degree of freedom information +- `mat`: The CSR matrix where the sparsity pattern will be established + +### Algorithm + +1. Retrieves the mesh pointer from the FEDOF object +2. Allocates connectivity array based on maximum total connectivity +3. For each element in the mesh: + - Gets the connectivity for the element + - For each degree of freedom in the element: + - Sets the sparsity pattern in the matrix for this DOF with respect to all other DOFs in the element +4. Finalizes the sparsity pattern + +## Interface 2 + +> FEDOF to FEDOF Interaction + +```fortran +MODULE SUBROUTINE SetSparsity2(obj, col_fedof, cellToCell, mat, ivar, jvar) + CLASS(FEDOF_), INTENT(INOUT) :: obj + CLASS(FEDOF_), INTENT(INOUT) :: col_fedof + INTEGER(I4B), INTENT(IN) :: cellToCell(:) + TYPE(CSRMatrix_), INTENT(INOUT) :: mat + INTEGER(I4B), INTENT(IN) :: ivar + INTEGER(I4B), INTENT(IN) :: jvar +END SUBROUTINE SetSparsity2 +``` + +### Purpose + +Creates a sparsity pattern in a CSR matrix using two FEDOF objects. This implementation is used for matrices representing operations between different finite element spaces (like coupling or transfer matrices). + +### Parameters + +- `obj`: The row FEDOF object that contains degree of freedom information +- `col_fedof`: The column FEDOF object that contains degree of freedom information +- `cellToCell`: Array mapping element indices from row to column mesh +- `mat`: The CSR matrix where the sparsity pattern will be established +- `ivar`: Physical variable index in row +- `jvar`: Physical variable index in column + +### Algorithm + +1. Retrieves mesh pointers from both FEDOF objects +2. Allocates connectivity arrays for both row and column elements +3. For each element in the row mesh: + - Gets the connectivity for the row element + - Finds the corresponding element in the column mesh using cellToCell + - Gets the connectivity for the column element + - For each DOF in the row element: + - Sets the sparsity pattern in the matrix for this row DOF with respect to all column DOFs + +## Interface 3 + +> Multiple FEDOF Interactions + +```fortran +INTERFACE FEDOFSetSparsity + MODULE SUBROUTINE SetSparsity3(fedofs, mat) + CLASS(FEDOFPointer_), INTENT(INOUT) :: fedofs(:) + TYPE(CSRMatrix_), INTENT(INOUT) :: mat + END SUBROUTINE SetSparsity3 +END INTERFACE FEDOFSetSparsity +``` + +There is also a third implementation (`SetSparsity3`) that handles sparsity pattern generation for multiple FEDOF objects. This is particularly useful for complex coupled problems with multiple physics or domains. + +## Usage Example + +```fortran +! For a single FEDOF (e.g., creating a stiffness matrix) +TYPE(FEDOF_) :: myFEDOF +TYPE(CSRMatrix_) :: stiffnessMatrix + +! Set up the sparsity pattern for the matrix +CALL myFEDOF%SetSparsity(stiffnessMatrix) + +! For FEDOF to FEDOF interaction (e.g., coupling two different fields) +TYPE(FEDOF_) :: velocityFEDOF, pressureFEDOF +TYPE(CSRMatrix_) :: couplingMatrix +INTEGER(I4B), ALLOCATABLE :: cellMap(:) + +! Set up cellMap to map between velocity and pressure elements +! ... + +! Set up the sparsity pattern for the coupling matrix +CALL velocityFEDOF%SetSparsity(pressureFEDOF, cellMap, couplingMatrix, 1, 2) +``` + +## Notes + +- The sparsity pattern defines which entries in the matrix are non-zero, allowing for efficient storage and computation. +- The methods check various conditions in debug mode to ensure validity of the inputs. +- The third variant (`SetSparsity3`) is particularly useful for block matrices with multiple physical variables. +- After setting the sparsity pattern, the matrix can be assembled efficiently by only computing and storing the non-zero entries. + +## Example 1 diff --git a/docs/docs-api/OneDimFEDOF/examples/_Copy_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_Copy_test_1.F90 new file mode 100644 index 00000000..f7e6b2c2 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Copy_test_1.F90 @@ -0,0 +1,71 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-06 +! summary: This method tests the COPY method for FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, obj2 +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseInterpolation = "Heirarchical", & + baseContinuity = "H1" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=1, mesh=meshptr) +!CALL fedof%Display("FEDOF:") +CALL obj2%copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL OK(found == want, "Total DOF (order=1): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=2, mesh=meshptr) +obj2 = obj +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() +CALL OK(found == want, "Total DOF (order=2): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=3, mesh=meshptr) +CALL obj2%Copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=3): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=4, mesh=meshptr) +obj2 = obj + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_Copy_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_Copy_test_1.md new file mode 100644 index 00000000..ebcca23a --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Copy_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Copy_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_Copy_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_Copy_test_2.F90 new file mode 100644 index 00000000..6e36c262 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Copy_test_2.F90 @@ -0,0 +1,77 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-06 +! summary: This method tests the COPY method for FEDOF class. +! Copy method is same as the assignment opertor. +! Copy method is tested for H1 Lagrange on linear triangular mesh. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, obj2 +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseInterpolation = "Lagrange", & + baseContinuity = "H1" + +INTEGER(I4B), PARAMETER :: ipType = TypeQuadratureOpt%equidistance + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=1, mesh=meshptr) +!CALL fedof%Display("FEDOF:") +CALL obj2%copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL OK(found == want, "Total DOF (order=1): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=2, mesh=meshptr) +obj2 = obj +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() +CALL OK(found == want, "Total DOF (order=2): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=3, mesh=meshptr) +CALL obj2%Copy(obj) + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=3): ") + +CALL obj%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=4, mesh=meshptr) +obj2 = obj + +found = obj2%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCaseName_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetCaseName_test_1.F90 new file mode 100644 index 00000000..fa818623 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCaseName_test_1.F90 @@ -0,0 +1,55 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Get case name + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +TYPE(HDF5File_) :: meshfile +CHARACTER(6) :: found, want + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & + order=1, mesh=meshptr) +found = obj%GetCaseName() +want = "H1HEIR" +CALL OK(found == want, "GetCaseName H1HEIR: ") + +CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Hierarchical", & + order=1, mesh=meshptr) +found = obj%GetCaseName() +want = "H1HIER" +CALL OK(found == want, "GetCaseName H1HIER: ") + +CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Lagrange", & + order=1, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) +found = obj%GetCaseName() +want = "H1LAGR" +CALL OK(found == want, "GetCaseName H1LAGR: ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCaseName_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetCaseName_test_1.md new file mode 100644 index 00000000..4d9c7efa --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCaseName_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCaseName_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_1.F90 new file mode 100644 index 00000000..0f3e61c0 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_1.F90 @@ -0,0 +1,140 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_1.md new file mode 100644 index 00000000..1211c367 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCellDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_2.F90 new file mode 100644 index 00000000..ee9682c3 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_2.F90 @@ -0,0 +1,140 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_2.md new file mode 100644 index 00000000..fe966b7c --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCellDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_3.F90 new file mode 100644 index 00000000..3aefd59a --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_3.F90 @@ -0,0 +1,141 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_4.F90 new file mode 100644 index 00000000..0b6fc922 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellDOF_test_4.F90 @@ -0,0 +1,141 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 0, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 63, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetCellDOF(globalCell=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 3, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 12+25*3+1, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellOrder_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetCellOrder_test_1.F90 new file mode 100644 index 00000000..64c3f765 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellOrder_test_1.F90 @@ -0,0 +1,133 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetCellOrder method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 1 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 2 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 3 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetCellOrder(globalElement=1, islocal=.TRUE., & + cellOrder=found, tCellOrder=tsize) + + want(1) = 4 + CALL IS(found(1), want(1), testname//" (order= "//ToString(order)//"): ") +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetCellOrder_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetCellOrder_test_1.md new file mode 100644 index 00000000..28143e33 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetCellOrder_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetCellOrder_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_1.F90 new file mode 100644 index 00000000..e562f2f0 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_1.F90 @@ -0,0 +1,158 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity // " " // baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_1.md new file mode 100644 index 00000000..e3288ea5 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_1.md @@ -0,0 +1,7 @@ + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetConnectivity_test_1.F90'; + +{CodeSnippet} + diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_2.F90 new file mode 100644 index 00000000..ffd45f22 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_2.F90 @@ -0,0 +1,161 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity // " " // baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices, tdof, localElemNum + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + tdof = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + localElemNum = meshptr%GetLocalElemNumber(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_2.md new file mode 100644 index 00000000..02f4e263 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetConnectivity_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_3.F90 new file mode 100644 index 00000000..f1fbf481 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_3.F90 @@ -0,0 +1,159 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity // " " // baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname // " GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_4.F90 new file mode 100644 index 00000000..4a9ad77b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetConnectivity_test_4.F90 @@ -0,0 +1,162 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetConnectivity method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeQuadratureOpt +USE AppendUtility +USE ArangeUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B), ALLOCATABLE :: globalNode(:) + INTEGER(I4B) :: ent(4), tVertices, tdof, localElemNum + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + tdof = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + localElemNum = meshptr%GetLocalElemNumber(globalElement=1, islocal=.TRUE.) + + ! Get all connectivity for local element 1 + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + isok = ALL(found == want) + CALL OK(isok, testname//" GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber(globalNode=globalNode(1:tVertices), & + islocal=.FALSE.) + a = meshptr%GetTotalVertexNodes() + 1 + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + b = meshptr%GetTotalVertexNodes() + ent(3) * (order - 1) + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname//" GetConnectivity (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B), ALLOCATABLE :: globalNode(:), temp1(:) + INTEGER(I4B) :: ent(4), a, b, tVertices + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetConnectivity(opt="A", globalElement=1, islocal=.TRUE.) + + globalNode = meshptr%GetConnectivity(globalElement=1, islocal=.TRUE.) + + tVertices = meshptr%GetTotalVertexNodes(globalElement=[1], islocal=.TRUE.) + + want = meshptr%GetLocalNodenumber( & + globalNode=globalNode(1:tVertices), islocal=.FALSE.) + + ent = meshptr%GetTotalEntities(globalElement=1, islocal=.TRUE.) + + a = totalVertexNodes + 1 + b = a - 1 + ent(3) * (order - 1) + + temp1 = Arange(a, b) + + want = want.APPEND.temp1 + + a = totalVertexNodes + totalFaces * (order - 1) + 1 + b = a - 1 + ent(4) * (order - 2) * (order - 1) * 0.5 + + temp1 = Arange(a, b) + want = want.APPEND.temp1 + + isok = ALL(found == want) + + CALL OK(isok, testname//" GetConnectivity (order= "//ToString(order)//"): ") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_1.F90 new file mode 100644 index 00000000..220bd713 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_1.F90 @@ -0,0 +1,139 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + con = fedof%GetConnectivity(globalElement=1, islocal=.TRUE., opt="A") + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + + CALL fedof%GetFaceDOF(globalElement=1, islocal=.TRUE., & + ans=found, tsize=tsize, localFaceNumber=1) + isok = tsize .EQ. 0 + CALL OK(isok, testname//" interface 2 (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + + CALL fedof%GetFaceDOF(globalElement=1, islocal=.TRUE., & + ans=found, tsize=tsize, localFaceNumber=1) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + + CALL fedof%GetFaceDOF(globalElement=1, islocal=.TRUE., & + ans=found, tsize=tsize, localFaceNumber=1) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_1.md new file mode 100644 index 00000000..8e322a53 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetFaceDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_2.F90 new file mode 100644 index 00000000..27f66326 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_2.F90 @@ -0,0 +1,122 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + con = fedof%GetConnectivity(globalElement=1, islocal=.TRUE., opt="A") + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_2.md new file mode 100644 index 00000000..a00a71b7 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetFaceDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_3.F90 new file mode 100644 index 00000000..7025f8c0 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_3.F90 @@ -0,0 +1,123 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found(10), want(10) + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + con = fedof%GetConnectivity(globalElement=1, islocal=.TRUE., opt="A") + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + isok = tsize .EQ. 0 + CALL OK(isok, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 1, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, found(10), want(10) + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + CALL fedof%GetFaceDOF(globalFace=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + CALL IS(tsize, 2, testname//" (order= "//ToString(order)//"): ") + CALL IS(found(1), 13, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_3.md b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_3.md new file mode 100644 index 00000000..7a77faa4 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetFaceDOF_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetFaceDOF_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_1.F90 new file mode 100644 index 00000000..2c21ac6d --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_1.F90 @@ -0,0 +1,252 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_1.md new file mode 100644 index 00000000..97523313 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_2.F90 new file mode 100644 index 00000000..7ce923ad --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_2.F90 @@ -0,0 +1,252 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_2.md new file mode 100644 index 00000000..c5f0b4d6 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_3.F90 new file mode 100644 index 00000000..e2e76b12 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_3.F90 @@ -0,0 +1,252 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_3.md b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_3.md new file mode 100644 index 00000000..89d8ec04 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_4.F90 new file mode 100644 index 00000000..3be6c349 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_4.F90 @@ -0,0 +1,252 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(:, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_4.md b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_4.md new file mode 100644 index 00000000..39ab3ef1 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_4.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetLocalElemshapeData_test_4.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_5.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_5.F90 new file mode 100644 index 00000000..5c5cf2a8 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetLocalElemshapeData_test_5.F90 @@ -0,0 +1,266 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-09 +! summary: This program tests the GetLocalElemshapeData +! method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt, ElemshapeData_ +USE QuadraturePoint_Method +USE ElemshapeData_Method +USE ApproxUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj, geoobj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetLocalElemshapeData " +CHARACTER(*), PARAMETER :: myName = "GetLocalElemshapeData_test_5", & + modName = "main" + +TYPE(HDF5File_) :: meshfile + +TYPE(QuadraturePoint_) :: quad + +TYPE(ElemshapeData_) :: elemsd, geoelemsd + +INTEGER(I4B) :: globalElement, telements, order, & + nodecon(100), ii, jj, nsd + +REAL(DFP) :: nodecoord(3, 100) + +LOGICAL(LGT) :: islocal, isok + +! CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +nsd = meshptr%GetNSD() + +CALL test1 +! CALL test2 +! CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + REAL(DFP) :: found(1), want(1) + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '1') + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '2') + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '3') + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal) + + CALL e%RaiseDebug(modName//'::'//myName//' - '// & + '4') + + found = SUM(elemsd%N, dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + REAL(DFP) :: found(1), want(1) + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test2 elemsd%dNdXt") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + REAL(DFP) :: found(1), want(1) + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + CALL geoobj%Initiate(baseContinuity="H1", & + baseInterpolation="Lagrange", & + order=1, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + globalElement = 1; islocal = .TRUE. + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=1, islocal=islocal) + + CALL obj%GetLocalElemshapeData(quad=quad, elemsd=elemsd, & + globalElement=globalElement, islocal=islocal) + + CALL geoobj%GetLocalElemshapeData(quad=quad, elemsd=geoelemsd, & + globalElement=globalElement, islocal=islocal) + + CALL meshptr%GetNodeCoord(nodecoord=nodecoord, nrow=ii, ncol=jj, & + globalElement=globalElement, islocal=islocal) + + CALL obj%GetGlobalElemshapeData(elemsd=elemsd, xij=nodecoord(1:nsd, 1:jj), & + globalElement=globalElement, islocal=islocal, & + geoelemsd=geoelemsd) + + found = SUM(elemsd%N(1:3, :), dim=1) + want = 1.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%N") + + found(1) = SUM(elemsd%dNdXi(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXi(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXi") + + found(1) = SUM(elemsd%dNdXt(:, 1, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + + found(1) = SUM(elemsd%dNdXt(:, 2, 1), dim=1) + want(1) = 0.0_DFP + isok = found(1) .approxeq.want(1) + CALL OK(isok, testname//" test3 elemsd%dNdXt") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_1.F90 new file mode 100644 index 00000000..c86fcb3d --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_1.F90 @@ -0,0 +1,97 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + +PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 + +TYPE(HDF5File_) :: meshfile +LOGICAL(LGT) :: isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_1.md new file mode 100644 index 00000000..c817c3bf --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_2.F90 new file mode 100644 index 00000000..6538744b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_2.F90 @@ -0,0 +1,97 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + +PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 + +TYPE(HDF5File_) :: meshfile +LOGICAL(LGT) :: isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_2.md new file mode 100644 index 00000000..29a1329e --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_3.F90 new file mode 100644 index 00000000..e8aacb22 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_3.F90 @@ -0,0 +1,97 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + +PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 + +TYPE(HDF5File_) :: meshfile +LOGICAL(LGT) :: isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_3.md b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_3.md new file mode 100644 index 00000000..7f2de94b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_4.F90 new file mode 100644 index 00000000..6a1eeba9 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_4.F90 @@ -0,0 +1,97 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetMaxTotalConnectivity method of FEDOF class + +PROGRAM main +USE BaseType, ONLY: TypeQuadratureOpt +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// & + " GetMaxTotalConnectivity test" + +INTEGER(I4B) :: order = 1 + +TYPE(HDF5File_) :: meshfile +LOGICAL(LGT) :: isok + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + INTEGER(I4B) :: found, want + + order = 1 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 3 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 1") +END SUBROUTINE test1 + +SUBROUTINE test2 + INTEGER(I4B) :: found, want + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 6 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 2") +END SUBROUTINE test2 + +SUBROUTINE test3 + INTEGER(I4B) :: found, want + + order = 3 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + found = obj%GetMaxTotalConnectivity() + want = 10 + isok = found .EQ. want + + CALL IS(found, want, testname//" test 3") +END SUBROUTINE test3 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_4.md b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_4.md new file mode 100644 index 00000000..51e10035 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetMaxTotalConnectivity_test_4.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetMaxTotalConnectivity_test_4.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetOrders_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetOrders_test_1.F90 new file mode 100644 index 00000000..651b6ca4 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetOrders_test_1.F90 @@ -0,0 +1,69 @@ +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../Mesh/examples/meshdata/small_mesh.h5" +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want +CHARACTER(:), ALLOCATABLE :: testname + +INTEGER(I4B) :: cellOrder(3), faceOrder(3, 100), edgeOrder(100), tfaceorient(2), & + cellOrient(3), faceOrient(3, 100), edgeOrient(100), & +globalElement, tedgeorient, tcellorder, tfaceorder, tedgeorder, tcellorient, & + telements + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%Initiate(baseContinuity="H1", baseInterpolation="Heirarchical", & + order=1, mesh=meshptr) +testname = "H1 Hierarchical order=1" + +! CALL obj%Display(testname) + +telements = meshptr%GetTotalElements() + +DO globalElement = 1, telements + + ! globalelement = 1 + CALL obj%GetOrders(cellorder=cellorder, faceorder=faceorder, & + edgeorder=edgeorder, cellorient=cellorient, faceorient=faceorient, & + edgeorient=edgeorient, tcellorder=tcellorder, tfaceorder=tfaceorder, & + tedgeorder=tedgeorder, tcellorient=tcellorient, tfaceorient=tfaceorient, & + tedgeorient=tedgeorient, globalelement=globalelement, islocal=.TRUE.) + + ! CALL Display(cellorder(1:tcellorder), "cellorder: ") + ! CALL Display(faceorder(1:3, 1:tfaceorder), "faceorder: ") + ! CALL Display(edgeorder(1:tedgeorder), "edgeOrder: ") + ! CALL Display(cellOrient(1:tcellorient), "cellOrient: ") + CALL Display(globalelement, "globalelements: ") + CALL Display(faceOrient(1:tfaceorient(1), 1:tfaceorient(2)), "faceOrient:") + +END DO + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_1.F90 new file mode 100644 index 00000000..35cf2ce1 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_1.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Hierarchical", & + testname = baseContinuity//" "//baseInterpolation// " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname //" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_1.md new file mode 100644 index 00000000..b43cafd9 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_2.F90 new file mode 100644 index 00000000..7b1302e8 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_2.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Hierarchical", & + testname = baseContinuity//" "//baseInterpolation// " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname //" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_2.md new file mode 100644 index 00000000..bc9acd58 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_3.F90 new file mode 100644 index 00000000..4d14e785 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_3.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname //" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_3.md b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_3.md new file mode 100644 index 00000000..db585212 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_4.F90 new file mode 100644 index 00000000..17f31dfa --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_4.F90 @@ -0,0 +1,130 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetQuadraturePoints method of FEDOF class +! obj_GetQuadraturePoints1(obj, quad, globalElement, quadratureType, & +! order, alpha, beta, lambda, islocal) + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: QuadraturePoint_, TypeQuadratureOpt +USE QuadraturePoint_Method + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom + +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation// & + " GetQuadraturePoints test:" + +TYPE(HDF5File_) :: meshfile +TYPE(QuadraturePoint_) :: quad + +INTEGER(I4B) :: globalElement, telements, order + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + order = 2 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, & + ipType=TypeQuadratureOpt%equidistance) + + telements = 1 + globalElement = 1 + order = 2 + + CALL obj%GetQuadraturePoints(quad=quad, globalElement=globalElement, & + quadratureType=TypeQuadratureOpt%GaussLegendre, & + order=order, islocal=.TRUE.) + + CALL Display(quad, testname//" quad: ") + +END SUBROUTINE test3 + +END PROGRAM main + +! total nodes = 25 +! total elements = 16 +! total faces = 40 +! total edges = 0 diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_4.md b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_4.md new file mode 100644 index 00000000..cb7dc0fc --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetQuadraturePoints_test_4.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetQuadraturePoints_test_4.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalCellDOF_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetTotalCellDOF_test_1.F90 new file mode 100644 index 00000000..a2ff6467 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalCellDOF_test_1.F90 @@ -0,0 +1,137 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetTotalCellDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalCellDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, want, found + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 0 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize, want, found + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 0 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize, want, found + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 1 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + + INTEGER(I4B) :: tsize, want, found + + order = 4 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalCellDOF(globalCell=1, islocal=.TRUE.) + want = 3 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalCellDOF_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetTotalCellDOF_test_1.md new file mode 100644 index 00000000..60dfe858 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalCellDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalCellDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_1.F90 new file mode 100644 index 00000000..7ccb88d7 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_1.F90 @@ -0,0 +1,188 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_1.md new file mode 100644 index 00000000..25f1bb0e --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_2.F90 new file mode 100644 index 00000000..43d46801 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_2.F90 @@ -0,0 +1,188 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_2.md new file mode 100644 index 00000000..cfcd0ff3 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_3.F90 new file mode 100644 index 00000000..236b6582 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_3.F90 @@ -0,0 +1,188 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() & + + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_4.F90 new file mode 100644 index 00000000..a545d59e --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalDOF_test_4.F90 @@ -0,0 +1,188 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-08 +! summary: Testing GetTotalDOF method of FEDOF class + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility +USE BaseType, ONLY: TypeQuadratureOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Lagrange", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalDOF" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B) :: tsize, found, want + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = meshptr%GetTotalVertexNodes(globalElement=1, islocal=.TRUE.) + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 0 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() + meshptr%GetTotalFaces() * (order - 1) + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 6 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 6 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 3 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 0 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr, ipType=TypeQuadratureOpt%equidistance) + + found = fedof%GetTotalDOF() + want = meshptr%GetTotalVertexNodes() & + + meshptr%GetTotalFaces() * (order - 1) & + + meshptr%GetTotalCells() * (order - 2) * (order - 1) * 0.5 + CALL IS(found, want, testname//" interface 1 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE.) + want = 10 + CALL IS(found, want, testname//" interface 2 (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="A") + want = 10 + CALL IS(found, want, testname//" interface 3 a (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="E") + want = 0 + CALL IS(found, want, testname//" interface 3 e (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="F") + want = 6 + CALL IS(found, want, testname//" interface 3 f (order= "// & + ToString(order)//"): ") + + found = fedof%GetTotalDOF(globalElement=1, islocal=.TRUE., opt="c") + want = 1 + CALL IS(found, want, testname//" interface 3 c (order= "// & + ToString(order)//"): ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalFaceDOF_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetTotalFaceDOF_test_1.F90 new file mode 100644 index 00000000..5da937b7 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalFaceDOF_test_1.F90 @@ -0,0 +1,130 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetTotalFaceDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" GetTotalFaceDOF test" + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize, found, want + INTEGER(I4B), ALLOCATABLE :: con(:) + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalFaceDOF(globalFace=1, islocal=.TRUE.) + want = 0 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + + found = fedof%GetTotalFaceDOF(globalElement=1, islocal=.TRUE., & + localFaceNumber=1) + + CALL IS(found, want, testname//" interface 2 (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: tsize, found, want + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalFaceDOF(globalFace=1, islocal=.TRUE.) + want = 1 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + + found = fedof%GetTotalFaceDOF(globalElement=1, islocal=.TRUE., & + localFaceNumber=1) + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: tsize, found, want + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + found = fedof%GetTotalFaceDOF(globalFace=1, islocal=.TRUE.) + want = 2 + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + + found = fedof%GetTotalFaceDOF(globalElement=1, islocal=.TRUE., & + localFaceNumber=1) + + CALL IS(found, want, testname//" (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetTotalFaceDOF_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetTotalFaceDOF_test_1.md new file mode 100644 index 00000000..367c4bbf --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetTotalFaceDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetTotalFaceDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_1.F90 new file mode 100644 index 00000000..78de482e --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_1.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetVertexDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +use ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_1.md new file mode 100644 index 00000000..7d1735f5 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetVertexDOF_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_2.F90 new file mode 100644 index 00000000..8987ee1d --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_2.F90 @@ -0,0 +1,129 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-07 +! summary: Testing GetVertexDOF method of FEDOF class +! H1 Heirarchical Second Order Triangular Mesh + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE AppendUtility +USE ArangeUtility +USE ReallocateUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + filename = "../../FEMesh/examples/meshdata/small_tri6_mesh.h5", & + baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +TYPE(HDF5File_) :: meshfile +INTEGER(I4B), ALLOCATABLE :: found(:), want(:) +INTEGER(I4B) :: order, totalVertexNodes, totalFaces +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') +meshptr => dom%GetMeshPointer() +totalVertexNodes = meshptr%GetTotalVertexNodes() +totalFaces = meshptr%GetTotalFaces() + +CALL test1 +CALL test2 +CALL test3 + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + + INTEGER(I4B) :: tsize + + order = 1 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF "//ToString(order)//"): ") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + INTEGER(I4B) :: tsize + + order = 2 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + + INTEGER(I4B) :: tsize + + order = 3 + CALL fedof%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=meshptr) + + CALL Reallocate(found, 2, want, 2) + CALL fedof%GetVertexDOF(globalNode=1, islocal=.TRUE., & + ans=found, tsize=tsize) + + want(1) = 1 + + isok = ALL(found == want) + CALL OK(isok, testname//" GetVertexDOF (order= "//ToString(order)//"): ") + +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_2.md new file mode 100644 index 00000000..7beb0839 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_GetVertexDOF_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetVertexDOF_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..2c558dde --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,86 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate FEDOF object by import from toml + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%ImportFromToml(tomlName="test1", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +!CALL fedof%Display("FEDOF:") +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL IS(found, want, "Total DOF (order=1): ") + +CALL obj%ImportFromToml(tomlName="test2", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=2): ") + +CALL obj%ImportFromToml(tomlName="test3", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=3): ") + +CALL obj%ImportFromToml(tomlName="test4", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +CALL obj%ImportFromToml(tomlName="test5", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +!CALL fedof%Display("FEDOF:") +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL IS(found, want, "Total DOF (order=1): ") + +CALL obj%ImportFromToml(tomlName="test6", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=2): ") + +CALL obj%ImportFromToml(tomlName="test7", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=3): ") + +CALL obj%ImportFromToml(tomlName="test8", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_1.md new file mode 100644 index 00000000..98662329 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_ImportFromToml_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_2.F90 new file mode 100644 index 00000000..3d82b9a9 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_2.F90 @@ -0,0 +1,50 @@ +!> author: Vikas Sharma, Ph. D. +! date: +! summary: Initiate fedof with H1 and Heirarchical bases, order is a vector. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE ReallocateUtility + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +TYPE(HDF5File_) :: meshfile +LOGICAL(LGT) :: isok +INTEGER(I4B) :: found, want, order, ii, iel + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%ImportFromToml(tomlName="test1", & + filename="./toml/_ImportFromToml_test_2.toml", mesh=meshptr) + +! CALL fedof%DisplayCellOrder("Debug Cell order", full=.TRUE.) + +found = fedof%GetTotalDOF() +want = 39 +isok = found == want +CALL IS(found, want, "Total DOF ") + +! CALL Display(fedof%GetConnectivity(globalElement=13, islocal=.FALSE., opt="A"), & +! "connectivity of global element 13", full=.TRUE.) + +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_2.md new file mode 100644 index 00000000..e6913521 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_2.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_ImportFromToml_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_3.F90 new file mode 100644 index 00000000..87898e8a --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_ImportFromToml_test_3.F90 @@ -0,0 +1,86 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate FEDOF object by import from toml + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDOF_) :: obj +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5" +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL obj%ImportFromToml(tomlName="test1", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +!CALL fedof%Display("FEDOF:") +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL IS(found, want, "Total DOF (order=1): ") + +CALL obj%ImportFromToml(tomlName="test2", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=2): ") + +CALL obj%ImportFromToml(tomlName="test3", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=3): ") + +CALL obj%ImportFromToml(tomlName="test4", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +CALL obj%ImportFromToml(tomlName="test5", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +!CALL fedof%Display("FEDOF:") +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() +CALL IS(found, want, "Total DOF (order=1): ") + +CALL obj%ImportFromToml(tomlName="test6", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + meshptr%GetTotalFaces() + 0*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=2): ") + +CALL obj%ImportFromToml(tomlName="test7", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 2*meshptr%GetTotalFaces() + 1*meshptr%GetTotalCells() +CALL IS(found, want, "Total DOF (order=3): ") + +CALL obj%ImportFromToml(tomlName="test8", & + filename="./toml/_ImportFromToml_test_1.toml", mesh=meshptr) +found = obj%GetTotalDOF() +want = meshptr%GetTotalNodes() + 3*meshptr%GetTotalFaces() + 3*meshptr%GetTotalCells() +CALL OK(found == want, "Total DOF (order=4): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_1.F90 new file mode 100644 index 00000000..d8a9f9b1 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_1.F90 @@ -0,0 +1,64 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-06 +! summary: Test the intitiate method for H1, Heirarchical basis, +! for different orders. + +PROGRAM main +USE OneDimFEDOF_Class, ONLY: OneDimFEDOF_ +USE OneDimDomain_Class, ONLY: OneDimDomain_ +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeFEVariableOpt, TypeQuadratureOpt, & + TypePolynomialOpt + +IMPLICIT NONE + +TYPE(OneDimFEDOF_) :: obj +TYPE(OneDimDomain_) :: dom +INTEGER(I4B) :: found, want, order +REAL(DFP), PARAMETER :: domain(2) = [0.0_DFP, 1.0_DFP] +CHARACTER(*), PARAMETER :: baseContinuity="H1" , baseInterpolation="Lagrange" +INTEGER(I4B), PARAMETER :: feType = TypeFEVariableOpt%scalar, & + ipType = TypeQuadratureOpt%equidistance, & + basisType = TypePolynomialOpt%monomial, & + quadratureType = TypeQuadratureOpt%gaussLegendre + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL dom%Initiate(domain=domain, totalElements=2) +! CALL dom%Display("domain: ") + +CALL test1 +CALL test2 + +CALL dom%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + order = 1 + CALL obj%Initiate(order=order, mesh=dom, baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, fetype=feType, ipType=ipType, & + basisType=basisType, quadratureType=quadratureType, quadratureOrder=order) + CALL obj%Display("FEDOF:") + found = obj%GetTotalDOF() + want = dom%GetTotalNodes() + CALL IS(found, want, "Total DOF (order=1): ") +END SUBROUTINE test1 + +SUBROUTINE test2 + order = 2 + CALL obj%Initiate(order=order, mesh=dom, baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, fetype=feType, ipType=ipType, & + basisType=basisType, quadratureType=quadratureType, quadratureOrder=order) + CALL obj%Display("FEDOF:") + found = obj%GetTotalDOF() + want = dom%GetTotalVertexNodes() + (order - 1) * dom%GetTotalElements() + CALL IS(found, want, "Total DOF ( order : "//Tostring(order)//"): ") +END SUBROUTINE test2 + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_1.md b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_1.md new file mode 100644 index 00000000..5b9586f1 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_1.md @@ -0,0 +1,7 @@ +This example shows how to initiate FEDOF with H1 and Hierarchy interpolation. + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_1.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_2.F90 new file mode 100644 index 00000000..1a6e795d --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_2.F90 @@ -0,0 +1,65 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate fedof for H1 and Heirarchical bases, order is a vector. + +PROGRAM main +USE OneDimFEDOF_Class, ONLY: OneDimFEDOF_ +USE OneDimDomain_Class, ONLY: OneDimDomain_ +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeFEVariableOpt, TypeQuadratureOpt, & + TypePolynomialOpt + +IMPLICIT NONE + +TYPE(OneDimFEDOF_) :: obj +TYPE(OneDimDomain_) :: dom +INTEGER(I4B) :: found, want, order +REAL(DFP), PARAMETER :: domain(2) = [0.0_DFP, 1.0_DFP] +CHARACTER(*), PARAMETER :: baseContinuity="H1" , baseInterpolation="Hierarchical", & + testname = baseContinuity//"_"//baseInterpolation +INTEGER(I4B), PARAMETER :: feType = TypeFEVariableOpt%scalar, & + ipType = TypeQuadratureOpt%equidistance, & + basisType = TypePolynomialOpt%monomial, & + quadratureType = TypeQuadratureOpt%gaussLegendre + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL dom%Initiate(domain=domain, totalElements=2) +! CALL dom%Display("domain: ") + +CALL test1 +CALL test2 + +CALL dom%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + order = 1 + CALL obj%Initiate(order=order, mesh=dom, baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, fetype=feType, ipType=ipType, & + basisType=basisType, quadratureType=quadratureType, quadratureOrder=order) + ! CALL obj%Display("FEDOF:") + found = obj%GetTotalDOF() + want = dom%GetTotalNodes() + CALL IS(found, want, "Total DOF (order=1): ") +END SUBROUTINE test1 + +SUBROUTINE test2 + order = 2 + CALL obj%Initiate(order=order, mesh=dom, baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, fetype=feType, ipType=ipType, & + basisType=basisType, quadratureType=quadratureType, quadratureOrder=order) + ! CALL obj%Display("FEDOF:") + found = obj%GetTotalDOF() + want = dom%GetTotalVertexNodes() + (order - 1) * dom%GetTotalElements() + CALL IS(found, want, "Total DOF ( order : "//Tostring(order)//"): ") +END SUBROUTINE test2 + +END PROGRAM main + diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_2.md b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_2.md new file mode 100644 index 00000000..100cfe13 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_2.md @@ -0,0 +1,7 @@ +This example shows how to initiate FEDOF with H1 and Hierarchy interpolation. Interface 2 of initiate method is used wherein order is a vector of integers representing the order of basis functions for each cell. + +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_2.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_3.F90 new file mode 100644 index 00000000..d91934ff --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_3.F90 @@ -0,0 +1,58 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate fedof for H1 and Heirarchical bases, order is a vector. + +PROGRAM main +USE OneDimFEDOF_Class, ONLY: OneDimFEDOF_ +USE OneDimDomain_Class, ONLY: OneDimDomain_ +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ReallocateUtility, ONLY: Reallocate +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeFEVariableOpt, TypeQuadratureOpt, & + TypePolynomialOpt + +IMPLICIT NONE + +TYPE(OneDimFEDOF_) :: obj +TYPE(OneDimDomain_) :: dom +INTEGER(I4B) :: found, want, quadratureOrder +REAL(DFP), PARAMETER :: domain(2) = [0.0_DFP, 1.0_DFP] +CHARACTER(*), PARAMETER :: baseContinuity="H1" , baseInterpolation="Hierarchical", & + testname = baseContinuity//"_"//baseInterpolation +INTEGER(I4B), PARAMETER :: feType = TypeFEVariableOpt%scalar, & + ipType = TypeQuadratureOpt%equidistance, & + basisType = TypePolynomialOpt%monomial, & + quadratureType = TypeQuadratureOpt%gaussLegendre +INTEGER(I4B), ALLOCATABLE :: order(:) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL dom%Initiate(domain=domain, totalElements=2) +! CALL dom%Display("domain: ") + +CALL test1 + +CALL dom%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + CALL Reallocate(order, 2) + order(1) = 1 + order(2) = 2 + quadratureOrder = 2 + CALL obj%Initiate(order=order, mesh=dom, baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, fetype=feType, ipType=ipType, & + basisType=basisType, quadratureType=quadratureType, quadratureOrder=quadratureOrder) + ! CALL obj%Display("FEDOF:") + found = obj%GetTotalDOF() + want = dom%GetTotalVertexNodes() + SUM(order - 1) + CALL IS(found, want, testname//" test 1: ") +END SUBROUTINE test1 + +END PROGRAM main + diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_3.md b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_3.md new file mode 100644 index 00000000..21aa7c8e --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_3.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_3.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_4.F90 new file mode 100644 index 00000000..22de3b15 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_4.F90 @@ -0,0 +1,58 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate fedof for H1 and Lagrange bases, order is a vector. + +PROGRAM main +USE OneDimFEDOF_Class, ONLY: OneDimFEDOF_ +USE OneDimDomain_Class, ONLY: OneDimDomain_ +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ReallocateUtility, ONLY: Reallocate +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeFEVariableOpt, TypeQuadratureOpt, & + TypePolynomialOpt + +IMPLICIT NONE + +TYPE(OneDimFEDOF_) :: obj +TYPE(OneDimDomain_) :: dom +INTEGER(I4B) :: found, want, quadratureOrder +REAL(DFP), PARAMETER :: domain(2) = [0.0_DFP, 1.0_DFP] +CHARACTER(*), PARAMETER :: baseContinuity="H1" , baseInterpolation="Lagrange", & + testname = baseContinuity//"_"//baseInterpolation +INTEGER(I4B), PARAMETER :: feType = TypeFEVariableOpt%scalar, & + ipType = TypeQuadratureOpt%equidistance, & + basisType = TypePolynomialOpt%monomial, & + quadratureType = TypeQuadratureOpt%gaussLegendre +INTEGER(I4B), ALLOCATABLE :: order(:) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL dom%Initiate(domain=domain, totalElements=2) +! CALL dom%Display("domain: ") + +CALL test1 + +CALL dom%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + CALL Reallocate(order, 2) + order(1) = 1 + order(2) = 2 + quadratureOrder = 2 + CALL obj%Initiate(order=order, mesh=dom, baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, fetype=feType, ipType=ipType, & + basisType=basisType, quadratureType=quadratureType, quadratureOrder=quadratureOrder) + ! CALL obj%Display("FEDOF:") + found = obj%GetTotalDOF() + want = dom%GetTotalVertexNodes() + SUM(order - 1) + CALL IS(found, want, testname//" test 1: ") +END SUBROUTINE test1 + +END PROGRAM main + diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_4.md b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_4.md new file mode 100644 index 00000000..107a927b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_4.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_4.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_5.F90 b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_5.F90 new file mode 100644 index 00000000..55261d4c --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_5.F90 @@ -0,0 +1,60 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-01 +! summary: Initiate fedof for H1 and Lagrange bases, order is a rank 2 array + +PROGRAM main +USE OneDimFEDOF_Class, ONLY: OneDimFEDOF_ +USE OneDimDomain_Class, ONLY: OneDimDomain_ +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ReallocateUtility, ONLY: Reallocate +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeFEVariableOpt, TypeQuadratureOpt, & + TypePolynomialOpt + +IMPLICIT NONE + +TYPE(OneDimFEDOF_) :: obj +TYPE(OneDimDomain_) :: dom +INTEGER(I4B) :: found, want, quadratureOrder +REAL(DFP), PARAMETER :: domain(2) = [0.0_DFP, 1.0_DFP] +CHARACTER(*), PARAMETER :: baseContinuity="H1" , baseInterpolation="Lagrange", & + testname = baseContinuity//"_"//baseInterpolation +INTEGER(I4B), PARAMETER :: feType = TypeFEVariableOpt%scalar, & + ipType = TypeQuadratureOpt%equidistance, & + basisType = TypePolynomialOpt%monomial, & + quadratureType = TypeQuadratureOpt%gaussLegendre +INTEGER(I4B), ALLOCATABLE :: order(:, :) + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL dom%Initiate(domain=domain, totalElements=2) +! CALL dom%Display("domain: ") + +CALL test1 + +CALL dom%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + CALL Reallocate(order, 2, 2) + ! order(1, ii) dentoes the global element number + ! order(2, ii) denotes the cell order + order(:, 1) = [2, 2] + order(:, 2) = [1, 1] + quadratureOrder = 2 + CALL obj%Initiate(order=order, mesh=dom, baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, fetype=feType, ipType=ipType, & + basisType=basisType, quadratureType=quadratureType, quadratureOrder=quadratureOrder) + ! CALL obj%Display("FEDOF:") + found = obj%GetTotalDOF() + want = dom%GetTotalVertexNodes() + (2 - 1) + (1 - 1) + CALL IS(found, want, testname//" test 1: ") +END SUBROUTINE test1 + +END PROGRAM main + diff --git a/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_5.md b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_5.md new file mode 100644 index 00000000..3e1a3ab6 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Initiate_test_5.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_Initiate_test_5.F90'; + +{CodeSnippet} diff --git a/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_1.F90 new file mode 100644 index 00000000..71226b5f --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_1.F90 @@ -0,0 +1,69 @@ +!f author: Vikas Sharma, Ph. D. +! date: 2024-05-24 +! summary: Lagrange polynomial is tested in this example + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: poly => TypePolynomialOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 1, ipType = poly%monomial +CHARACTER(*), PARAMETER :: baseContinuity = "H1" +CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + +found = fedof%GetTotalDOF() + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_2.F90 new file mode 100644 index 00000000..559f4d53 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_2.F90 @@ -0,0 +1,69 @@ +!f author: Vikas Sharma, Ph. D. +! date: 2024-05-24 +! summary: Lagrange polynomial is tested in this example + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: poly => TypePolynomialOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 2, ipType = poly%monomial +CHARACTER(*), PARAMETER :: baseContinuity = "H1" +CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + +found = fedof%GetTotalDOF() + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_3.F90 new file mode 100644 index 00000000..f3e98ad1 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_3.F90 @@ -0,0 +1,69 @@ +!f author: Vikas Sharma, Ph. D. +! date: 2024-05-24 +! summary: Lagrange polynomial is tested in this example + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: poly => TypePolynomialOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 3, ipType = poly%monomial +CHARACTER(*), PARAMETER :: baseContinuity = "H1" +CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + +found = fedof%GetTotalDOF() + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_4.F90 b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_4.F90 new file mode 100644 index 00000000..f78f8855 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_Lagrange_test_4.F90 @@ -0,0 +1,71 @@ +!f author: Vikas Sharma, Ph. D. +! date: 2024-05-24 +! summary: Lagrange polynomial is tested in this example +! I am checking the totalDOF for a fedof of order 4 on +! a linear mesh. + +PROGRAM main +USE FEDOF_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: poly => TypePolynomialOpt + +IMPLICIT NONE + +TYPE(FEDOF_) :: fedof +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: meshptr => NULL() +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" + +TYPE(HDF5File_) :: meshfile +INTEGER(I4B) :: found, want, entities(4), totalVertexNodes +INTEGER(I4B), PARAMETER :: order = 4, ipType = poly%monomial +CHARACTER(*), PARAMETER :: baseContinuity = "H1" +CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(meshfile, '') + +meshptr => dom%GetMeshPointer() + +CALL fedof%Initiate(baseContinuity=baseContinuity, ipType=ipType, & + baseInterpolation=baseInterpolation, order=order, & + mesh=meshptr) + +! CALL fedof%Display("FEDOF:") +entities = meshptr%GetTotalEntities() +CALL Display(entities, "Total entities in mesh: ") + +found = fedof%GetTotalDOF() + +IF (order .EQ. 1) THEN + + want = meshptr%GetTotalVertexNodes() + +ELSE + + want = meshptr%GetTotalVertexNodes() + & + entities(3) * (order - 1) + & + entities(4) * (order - 2) * (order - 1) / 2 + +END IF + +CALL IS(found, want, "Total DOF (order= "//tostring(order)//"): ") + +!CALL dom%Display("domain:") +CALL dom%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main + +! Total vertex = 12 +! Total edges = 25 +! Total elements = 14 diff --git a/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_1.F90 b/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_1.F90 new file mode 100644 index 00000000..1ce46a9b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_1.F90 @@ -0,0 +1,181 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-10 +! summary: Testing SetSparsity method of FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEMesh_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType +USE DOF_Method +USE CSRMatrix_Method +USE ApproxUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5" + +CHARACTER(*), PARAMETER :: baseContinuity = "H1", & + baseInterpolation = "Heirarchical", & + testname = baseContinuity//" "//baseInterpolation//" SetSparsity " + +INTEGER(I4B), PARAMETER :: nsd = 2 + +INTEGER(I4B) :: ii, jj, order + +TYPE(CSRMatrix_) :: mat +TYPE(DOF_) :: dofobj +TYPE(FEDOF_) :: obj +TYPE(FEMesh_) :: mesh +TYPE(HDF5File_) :: meshfile +REAL(DFP), ALLOCATABLE :: found(:, :), want(:, :) +LOGICAL(LGT) :: isok + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() +CALL mesh%Initiate(meshfile, dim=nsd) + +CALL test1 +CALL test2 + +!CALL mesh%Display("domain:") +CALL mesh%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +CONTAINS + +SUBROUTINE test1 + + order = 1 + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=mesh) + + CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalDOF()], & + names=['K'], spaceCompo=[1], timeCompo=[1], & + storageFMT=NODES_FMT) + + CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & + idof=dofobj, jdof=dofobj) + + CALL obj%SetSparsity(mat=mat) + + !! setting all entries to 1.0 + mat = 1.0_DFP + + !! converting sparse matrix to dense matrix + !! for testing + found = mat + + ALLOCATE (want(9, 9)) + want = 0.0_DFP + + want(1, [1, 5, 7, 9]) = 1.0_DFP + want(2, [2, 5, 8, 9]) = 1.0_DFP + want(3, [3, 6, 7, 9]) = 1.0_DFP + want(4, [4, 6, 8, 9]) = 1.0_DFP + want(5, [5, 1, 2, 7, 8, 9]) = 1.0_DFP + want(6, [6, 3, 4, 7, 8, 9]) = 1.0_DFP + want(7, [7, 1, 3, 5, 6, 9]) = 1.0_DFP + want(8, [8, 2, 4, 5, 6, 9]) = 1.0_DFP + want(9, [9, 1, 2, 3, 4, 5, 6, 7, 8]) = 1.0_DFP + + do_jj: DO jj = 1, SIZE(want, 2) + DO ii = 1, SIZE(want, 1) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT do_jj + + END IF + END DO + END DO do_jj + + CALL OK(isok, testname//" test1") + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + order = 2 + + CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=mesh) + + CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalDOF()], & + names=['K'], spaceCompo=[1], timeCompo=[1], & + storageFMT=NODES_FMT) + + CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & + idof=dofobj, jdof=dofobj) + + CALL obj%SetSparsity(mat=mat) + + mat = 1.0_DFP + + found = mat + + want = found + want = 0.0_DFP + + want(1, [1, 5, 7, 9, 10, 11, 12, 13, 22]) = 1.0_DFP + ii = 1 + DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT + END IF + END DO + + CALL OK(isok, testname//" test2") + + want(5, [5, 1, 2, 7, 8, 9, 10, 11, 12, 13, 22, 17, 18, 19, 24]) = 1.0_DFP + ii = 5 + DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT + END IF + END DO + CALL OK(isok, testname//" test2") + + want(11, [11, 1, 2, 5, 7, 8, 9, 10, 12, 13, 22, 17, 18, 19, 24]) = 1.0_DFP + ii = 11 + DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT + END IF + END DO + CALL OK(isok, testname//" test2") + +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +END PROGRAM main + +! mesh info: +! ============================== +! total nodes: 9 +! total elements: 4 +! tEdges: 0 +! tFaces: 12 diff --git a/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_2.F90 b/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_2.F90 new file mode 100644 index 00000000..2c75318b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_2.F90 @@ -0,0 +1,111 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-10 +! summary: This subroutine tests the SetSparsity method of the FEDOF class. + +PROGRAM main +USE FEDOF_Class +USE FEMesh_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class +USE BaseType +USE DOF_Method +USE CSRMatrix_Method +USE ApproxUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: filename = & + "../../FEMesh/examples/meshdata/very_small_quad4_mesh.h5" + +CHARACTER(*), PARAMETER :: baseContinuity = "H1", & + baseInterpolation = "Heirarchical" + +INTEGER(I4B), PARAMETER :: order = 2, nsd = 2 + +INTEGER(I4B) :: ii, jj + +TYPE(CSRMatrix_) :: mat +TYPE(DOF_) :: dofobj +TYPE(FEDOF_) :: obj +TYPE(FEMesh_) :: mesh +TYPE(HDF5File_) :: meshfile +REAL(DFP), ALLOCATABLE :: found(:, :), want(:, :) +LOGICAL(LGT) :: isok +INTEGER(I4B), ALLOCATABLE :: nptrs(:) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() + +CALL mesh%Initiate(meshfile, dim=nsd) + +CALL mesh%DisplayMeshInfo("mesh info:") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=mesh) + +CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalDOF()], & + names=['K'], spaceCompo=[1], timeCompo=[1], & + storageFMT=NODES_FMT) + +CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & + idof=dofobj, jdof=dofobj) + +CALL obj%SetSparsity(mat=mat) + +mat = 1.0_DFP + +found = mat + +want = found +want = 0.0_DFP + +want(1, [1, 5, 7, 9, 10, 11, 12, 13, 22]) = 1.0_DFP +ii = 1 +DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT + END IF +END DO + +CALL OK(isok, "CSRMatrix_Method: SetSparsity") + +want(5, [5, 1, 2, 7, 8, 9, 10, 11, 12, 13, 22, 17, 18, 19, 24]) = 1.0_DFP +ii = 5 +DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT + END IF +END DO +CALL OK(isok, "CSRMatrix_Method: SetSparsity") + +want(11, [11, 1, 2, 5, 7, 8, 9, 10, 12, 13, 22, 17, 18, 19, 24]) = 1.0_DFP +ii = 11 +DO jj = 1, SIZE(want, 2) + isok = found(ii, jj) .EQ. want(ii, jj) + IF (.NOT. isok) THEN + CALL Display([ii, jj], "ii, jj: ") + EXIT + END IF +END DO +CALL OK(isok, "CSRMatrix_Method: SetSparsity") + +! CALL Display(INT(found), "sparse matrix:", full=.TRUE.) +! DO ii = 1, mesh%GetTotalElements() +! nptrs = obj%GetConnectivity(globalElement=ii, islocal=.TRUE., opt="A") +! CALL Display(nptrs, "connectivity for iel ("//tostring(ii)//"): ", orient="ROW", full=.TRUE.) +! END DO + +!CALL mesh%Display("domain:") +CALL mesh%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_3.F90 b/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_3.F90 new file mode 100644 index 00000000..466306c8 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/_SetSparsity_test_3.F90 @@ -0,0 +1,95 @@ +PROGRAM main +USE FEDOF_Class +USE FEMesh_Class +USE AbstractMesh_Class +USE HDF5File_Class +USE Display_Method +USE GlobalData +USE Test_Method +USE ExceptionHandler_Class +USE BaseType +USE DOF_Method +USE CSRMatrix_Method +USE ApproxUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: filename = & + "../../Mesh/examples/meshdata/very_small_quad4_mesh.h5" + +CHARACTER(*), PARAMETER :: baseContinuity = "H1", & + baseInterpolation = "Heirarchical" + +INTEGER(I4B), PARAMETER :: order = 2, nsd = 2 + +INTEGER(I4B) :: ii, jj + +TYPE(CSRMatrix_) :: mat +TYPE(DOF_) :: dofobj +TYPE(FEDOF_) :: obj +TYPE(FEMesh_) :: mesh +TYPE(HDF5File_) :: meshfile +REAL(DFP), ALLOCATABLE :: found(:, :), want(:, :) +LOGICAL(LGT) :: isok +INTEGER(I4B), ALLOCATABLE :: nptrs(:) + +CALL meshfile%Initiate(filename, mode="READ") +CALL meshfile%OPEN() + +CALL mesh%Initiate(meshfile, dim=nsd) + +CALL mesh%DisplayMeshInfo("mesh info:") + +CALL obj%Initiate(baseContinuity=baseContinuity, & + baseInterpolation=baseInterpolation, & + order=order, mesh=mesh) + +CALL Initiate(obj=dofobj, tNodes=[obj%GetTotalDOF()], & + names=['K'], spaceCompo=[1], timeCompo=[1], & + storageFMT=NODES_FMT) + +CALL Initiate(mat, ncol=SIZE(dofobj), nrow=SIZE(dofobj), & + idof=dofobj, jdof=dofobj) + +CALL obj%SetSparsity(mat=mat) + +mat = 1.0_DFP + +found = mat + +! ALLOCATE (want(9, 9)) +! want = 0.0_DFP +! +! want(1, [1, 5, 7, 9]) = 1.0_DFP +! want(2, [2, 5, 8, 9]) = 1.0_DFP +! want(3, [3, 6, 7, 9]) = 1.0_DFP +! want(4, [4, 6, 8, 9]) = 1.0_DFP +! want(5, [5, 1, 2, 7, 8, 9]) = 1.0_DFP +! want(6, [6, 3, 4, 7, 8, 9]) = 1.0_DFP +! want(7, [7, 1, 3, 5, 6, 9]) = 1.0_DFP +! want(8, [8, 2, 4, 5, 6, 9]) = 1.0_DFP +! want(9, [9, 1, 2, 3, 4, 5, 6, 7, 8]) = 1.0_DFP +! +! DO jj = 1, SIZE(want, 2) +! DO ii = 1, SIZE(want, 1) +! isok = found(ii, jj) .EQ. want(ii, jj) +! IF (.NOT. isok) THEN +! CALL Display([ii, jj], "ii, jj: ") +! END IF +! END DO +! END DO + +CALL OK(isok, "CSRMatrix_Method: SetSparsity") + +CALL Display(INT(found), "sparse matrix:", full=.TRUE.) + +DO ii = 1, mesh%GetTotalElements() + nptrs = obj%GetConnectivity(globalElement=ii, islocal=.TRUE., opt="A") + CALL Display(nptrs, "connectivity for iel ("//tostring(ii)//"): ", orient="ROW", full=.TRUE.) +END DO + +!CALL mesh%Display("domain:") +CALL mesh%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/OneDimFEDOF/examples/runner.toml b/docs/docs-api/OneDimFEDOF/examples/runner.toml new file mode 100644 index 00000000..042fef0b --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/OneDimFEDOF" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/OneDimFEDOF/examples/toml/_ImportFromToml_test_1.toml b/docs/docs-api/OneDimFEDOF/examples/toml/_ImportFromToml_test_1.toml new file mode 100644 index 00000000..1207cf73 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/toml/_ImportFromToml_test_1.toml @@ -0,0 +1,39 @@ +[test1] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = 1 + +[test2] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = 2 + +[test3] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = 3 + +[test4] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = 4 + +[test5] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = [1] + +[test6] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = [2] + +[test7] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = [3] + +[test8] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = [4] diff --git a/docs/docs-api/OneDimFEDOF/examples/toml/_ImportFromToml_test_2.toml b/docs/docs-api/OneDimFEDOF/examples/toml/_ImportFromToml_test_2.toml new file mode 100644 index 00000000..39558d89 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/examples/toml/_ImportFromToml_test_2.toml @@ -0,0 +1,35 @@ +[test1] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = "./toml/order.csv" +# [ +# [14, 1], +# [15, 1], +# [17, 1], +# [18, 1], +# [24, 1], +# [21, 2], +# [22, 2], +# [23, 2], +# [25, 2], +# [13, 3], +# [16, 3], +# [19, 3], +# [20, 3], +# [26, 3] +# ] + +[test2] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = 2 + +[test3] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = 3 + +[test4] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +order = 4 diff --git a/docs/docs-api/OneDimFEDOF/index.md b/docs/docs-api/OneDimFEDOF/index.md new file mode 100644 index 00000000..7ad1f116 --- /dev/null +++ b/docs/docs-api/OneDimFEDOF/index.md @@ -0,0 +1,109 @@ +--- +sidebar_position: 1 +date: 2024-05-18 +update: 2024-05-18 +status: stable +docs: done +extpkgs: none +category: + - Domain + - Mesh + - ShapeFunctions +tags: + - easifemClasses + - mesh + - shapefunctions + - dof +--- + +# OneDimFEDOF + +Data type for finite element degree of freedoms. +`OneDimFEDOF_` defines the abstract node in finite element method. +The meaning of degree of freedom depends upon the basis interpolation function and type. +For example, in the case of Lagrange interpolation, the degree of freedoms corresponds to the nodes in the element. +The basic steps of using this data type is given below. + +## Basic usage + +### Constructor methods + +Although, there are several ways to initiate an instance of `FEDOF`. The most common way is to call the [`Initiate`](./Initiate.md) method. + +```fortran +CALL obj%Initiate(order, mesh, baseContinuity, baseInterpolation, ipType, basisType, alpha, beta, lambda, islocal) +``` + +- Here `order` represents the order of each element. It can be a scalar, vector, or a two dimensional matrix of integers. [The method with scalar order is given here.](./Initiate.md) + - When `order` is a vector of integer then it represents the order of each cell element. In this case, the length of `order` must be equal to the number of elements in the mesh. + - When `order` is a matrix of integer then the first row represents the global number of cell element, and the second row represents the order of cell element. + +You can also initiate an instance of `FEDOF` using [ParameterList](/docs/docs-api/ParameterList/index.md). The process is given below. + +- First, set parameters in `ParameterList` object by using [SetFEDOFParam](./SetFEDOFParam.md). +- Then, initiate an instance of `FEDOF` using `ParameterList` object by using [Initiate](/docs/docs-api/FEDOF/Initiate.md#interface-3) + +```fortran +CALL obj%Initiate(param, mesh) +``` + +| Method | Description | +| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| [`Initiate`](./Initiate.md) | Initializes a FEDOF (Finite Element Degrees of Freedom) object with various options for element order specification | +| [`SetFEDOFParam`](./SetFEDOFParam.md) | Sets essential parameters for constructing a FEDOF object in a parameter list | +| [`Copy` / `ASSIGNMENT(=)`](./Copy.md) | Copies the contents of one FEDOF object to another | +| [`DEALLOCATE`](./Copy.md) | Deallocates all data and resources used by a FEDOF object | + +These constructor methods handle the creation, initialization, and cleanup of FEDOF objects, which represent the degrees of freedom for finite element calculations. + +### Get methods + +The following table provides an overview of all methods defined in the GetMethods submodule of the OneDimFEDOF_Class. + +| Method Name | Purpose | +| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| [`GetCaseName`](./GetCaseName.md) | Gets the case name of FEDOF (combines baseContinuity and baseInterpolation) | +| [`GetVertexDOF`](./GetVertexDOF.md) | Retrieves the degrees of freedom associated with a vertex/node | +| [`GetEdgeDOF`](./GetEdgeDOF.md) | Retrieves the degrees of freedom associated with an edge | +| [`GetTotalEdgeDOF`](./GetTotalEdgeDOF.md) | Returns the total number of degrees of freedom on an edge | +| [`GetFaceDOF`](./GetFaceDOF.md) | Retrieves the degrees of freedom associated with a face | +| [`GetTotalFaceDOF`](./GetTotalFaceDOF.md) | Returns the total number of degrees of freedom on a face | +| [`GetCellDOF`](./GetCellDOF.md) | Retrieves the degrees of freedom associated with a cell | +| [`GetTotalCellDOF`](./GetTotalCellDOF.md) | Returns the total number of degrees of freedom on a cell | +| [`GetTotalVertexDOF`](./GetTotalVertexDOF.md) | Returns the total number of vertex degrees of freedom | +| [`GetTotalDOF`](./GetTotalDOF.md) | Returns the total number of degrees of freedom (in the entire mesh, an element, or filtered by type) | +| [`GetConnectivity`](./GetConnectivity.md) | Returns the connectivity array for an element | +| [`GetConnectivity_`](./GetConnectivity_.md) | Internal method for writing connectivity information into a provided array | +| [`GetPrefix`](./GetPrefix.md) | Returns the prefix used for setting data ("FEDOF") | +| [`GetMeshPointer`](./GetMeshPointer.md) | Returns a pointer to the associated mesh object | +| [`GetBaseInterpolation`](./GetBaseInterpolation.md) | Returns the base interpolation type used | +| [`GetCellOrder`](./GetCellOrder.md) | Retrieves the polynomial order of a cell | +| [`GetOrders`](./GetOrders.md) | Gets the cell, face, and edge orders and their orientations | +| [`GetMaxTotalConnectivity`](./GetMaxTotalConnectivity.md) | Returns the maximum size of connectivity across all elements | +| [`GetQuadraturePoints`](./GetQuadraturePoints.md) | Creates quadrature points for numerical integration | +| [`GetLocalElemShapeData`](./GetLocalElemShapeData.md) | Retrieves local element shape functions data | +| [`GetGlobalElemShapeData`](./GetGlobalElemShapeData.md) | Maps local shape functions to the global coordinate system | + +### IO Methods + +| Method | Description | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| `Display` | Displays the content of a FEDOF object including configuration, mesh information, and allocation status | +| `DisplayCellOrder` | Displays information about the cell order array and its contents | +| [`ImportFromToml`](./ImportFromToml.md) | Imports FEDOF configuration from a TOML file or table | + +These IO methods provide functionality for: + +- Displaying the state and configuration of a FEDOF object for debugging and information purposes +- Reading configuration from standardized TOML format files or tables +- Visualizing specific aspects of the FEDOF configuration like cell orders + +## Setting sparsity + +The sparsity of the FEDOF object can be set using the [`SetSparsity`](./SetSparsity.md) method. This method allows you to define how the degrees of freedom are organized and accessed, which can optimize performance for specific applications. + +## Methods + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/docs-api/ProductUtility/examples/_OTimeTilda_test_1.F90 b/docs/docs-api/ProductUtility/examples/_OTimeTilda_test_1.F90 new file mode 100644 index 00000000..d4dca7ba --- /dev/null +++ b/docs/docs-api/ProductUtility/examples/_OTimeTilda_test_1.F90 @@ -0,0 +1,24 @@ +PROGRAM main +USE GlobalData +USE ProductUtility +USE Test_Method +USE ApproxUtility +USE ReallocateUtility +USE BaseType, ONLY: math => TypeMathOpt +USE Display_Method + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: testname = "OtimeTilda_test_1" +REAL(DFP), ALLOCATABLE :: a(:), b(:), ans(:) +INTEGER(I4B) :: tsize + +a = [1, 2] +b = [3, 4, 5] + +CALL Reallocate(ans, SIZE(a) * SIZE(b)) +CALL OTimesTilda_(a, b, ans, tsize, math%zero, math%one) + +CALL Display(ans, "OtimeTilda_test_1 ans") + +END PROGRAM main diff --git a/docs/docs-api/ProductUtility/examples/runner.toml b/docs/docs-api/ProductUtility/examples/runner.toml index 05bf8860..507169e8 100644 --- a/docs/docs-api/ProductUtility/examples/runner.toml +++ b/docs/docs-api/ProductUtility/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/product/" +BuildDir = "/tmp/easifem-tests/ProductUtility/" TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/QuadraturePoint/GaussLegendreLobattoQuadrature.md b/docs/docs-api/QuadraturePoint/GaussLegendreLobattoQuadrature.md index 7a1cc214..7dba1dad 100644 --- a/docs/docs-api/QuadraturePoint/GaussLegendreLobattoQuadrature.md +++ b/docs/docs-api/QuadraturePoint/GaussLegendreLobattoQuadrature.md @@ -10,7 +10,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; :::note -For line-element n point Gauss Lobatto rule has $2n-3$ degree of accuracy.\ +For line-element n point Gauss Lobatto rule has $2n-3$ degree of accuracy. ::: ## Interface 1 diff --git a/docs/docs-api/QuadraturePoint/GaussLegendreRadauRightQuadrature.md b/docs/docs-api/QuadraturePoint/GaussLegendreRadauRightQuadrature.md index 8d0d5c61..b9620d57 100644 --- a/docs/docs-api/QuadraturePoint/GaussLegendreRadauRightQuadrature.md +++ b/docs/docs-api/QuadraturePoint/GaussLegendreRadauRightQuadrature.md @@ -8,7 +8,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; :::note -For line-element n point Gauss Legendre Radau rule has $2n-2$ degree of accuracy.\ +For line-element n point Gauss Legendre Radau rule has $2n-2$ degree of accuracy. ::: ## Interface 1 diff --git a/docs/docs-api/QuadraturePoint/Initiate.md b/docs/docs-api/QuadraturePoint/Initiate.md index 7b06f753..9477ce32 100644 --- a/docs/docs-api/QuadraturePoint/Initiate.md +++ b/docs/docs-api/QuadraturePoint/Initiate.md @@ -4,16 +4,10 @@ This subroutine constructs the quadrature points. ## Interface 1 -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - ```fortran INTERFACE Initiate - MODULE SUBROUTINE quad_initiate3(obj, refElem, order, quadratureType, & - & alpha, beta, lambda) + MODULE SUBROUTINE Initiate(obj, refElem, order, quadratureType, & + alpha, beta, lambda) TYPE(QuadraturePoint_), INTENT(INOUT) :: obj !! Total number of xidimension CLASS(ReferenceElement_), INTENT(IN) :: refElem @@ -22,69 +16,43 @@ INTERFACE Initiate !! order of integrand CHARACTER(*), INTENT(IN) :: quadratureType !! Type of quadrature points - !! "GaussLegendre" - !! "GaussLegendreLobatto" - !! "GaussLegendreRadau", "GaussLegendreRadauLeft" - !! "GaussLegendreRadauRight" - !! "GaussChebyshev" - !! "GaussChebyshevLobatto" - !! "GaussChebyshevRadau", "GaussChebyshevRadauLeft" - !! "GaussChebyshevRadauRight" REAL(DFP), OPTIONAL, INTENT(IN) :: alpha !! Jacobi parameter REAL(DFP), OPTIONAL, INTENT(IN) :: beta !! Jacobi parameter REAL(DFP), OPTIONAL, INTENT(IN) :: lambda !! Ultraspherical parameter - END SUBROUTINE quad_initiate3 + END SUBROUTINE Initiate END INTERFACE Initiate ``` -:::note `quadratureType` -::: - Type of quadrature points: -- "GaussLegendre" -- "GaussLegendreLobatto" -- "GaussLegendreRadau", "GaussLegendreRadauLeft" -- "GaussLegendreRadauRight" -- "GaussChebyshev" -- "GaussChebyshevLobatto" -- "GaussChebyshevRadau", "GaussChebyshevRadauLeft" -- "GaussChebyshevRadauRight" -- "GaussJacobi" -- "GaussJacobiLobatto" -- "GaussJacobiRadau", "GaussJacobiRadauLeft" -- "GaussJacobiRadauRight" -- "GaussUltraspherical" -- "GaussUltrasphericalLobatto" -- "GaussUltrasphericalRadau", "GaussUltraspericalRadauLeft" -- "GaussUltrasphericalRadauRight" - -In the case of `Jacobi` `alpha` and `beta` should be given, and in the case of `Ultraspherical` `lambda` should be given. +| Argument | Type | Intent | Optional | Description | +| -------------- | ------------------------ | ------ | -------- | ----------------------------------------------------------------- | +| obj | TYPE(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| refElem | CLASS(ReferenceElement_) | IN | No | Reference element | +| order | INTEGER(I4B) | IN | No | Order of integrand | +| quadratureType | CHARACTER(*) | IN | No | Type of quadrature points | +| alpha | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| beta | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| lambda | REAL(DFP) | IN | Yes | Ultraspherical parameter (required for Ultraspherical quadrature) | - +> In the case of `Jacobi` `alpha` and `beta` should be given, and in the case of `Ultraspherical` `lambda` should be given. +> Details about `quadratureType` can be found in the [QuadraturePoint](./QuadraturePoint_.md) documentation. - +### Example -import EXAMPLE10 from "./_Initiate_test_1d.md"; +import EXAMPLE10 from "./examples/_Initiate_test_1.md"; - - - - - - - ## Interface 2 ```fortran -INTERFACE Initiate - MODULE SUBROUTINE quad_initiate4(obj, refElem, nips, quadratureType, & - & alpha, beta, lambda) +INTERFACE + MODULE SUBROUTINE Initiate(obj, refElem, nips, quadratureType, & + alpha, beta, lambda) TYPE(QuadraturePoint_), INTENT(INOUT) :: obj !! Total number of xidimension CLASS(ReferenceElement_), INTENT(IN) :: refElem @@ -98,27 +66,34 @@ INTERFACE Initiate !! Jacobi parameter REAL(DFP), OPTIONAL, INTENT(IN) :: lambda !! Ultraspherical parameter - END SUBROUTINE quad_initiate4 -END INTERFACE Initiate + END SUBROUTINE Initiate +END INTERFACE ``` -:::info This method allows us to initiate the quadrature points by specifying the number of integration points, and quadrature type. -::: + +| Argument | Type | Intent | Optional | Description | +| -------------- | ------------------------ | ------ | -------- | ----------------------------------------------------------------- | +| obj | TYPE(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| refElem | CLASS(ReferenceElement_) | IN | No | Reference element | +| nips | INTEGER(I4B) | IN | No | Number of integration points (array of size 1) | +| quadratureType | CHARACTER(*) | IN | No | Type of quadrature points | +| alpha | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| beta | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| lambda | REAL(DFP) | IN | Yes | Ultraspherical parameter (required for Ultraspherical quadrature) | + +### Example + +> See the example given in the Interface 1 ## Interface 3 - - +This interface is similar to the Interface 1, but in this interface quadratureType are in integer. +You can read more about the quadrature types in the [QuadraturePoint](./QuadraturePoint_.md) documentation. ```fortran INTERFACE Initiate - MODULE SUBROUTINE quad_initiate5( & - & obj, & - & refElem, & - & order, & - & quadratureType, & - & alpha, beta, lambda) + MODULE SUBROUTINE Initiate(obj, refElem, order, quadratureType, alpha, beta, lambda) TYPE(QuadraturePoint_), INTENT(INOUT) :: obj !! Total number of xidimension CLASS(ReferenceElement_), INTENT(IN) :: refElem @@ -127,77 +102,38 @@ INTERFACE Initiate !! order of integrand INTEGER(I4B), INTENT(IN) :: quadratureType !! Type of quadrature points - !! GaussLegendre - !! GaussLegendreLobatto - !! GaussLegendreRadau - !! GaussLegendreRadauLeft - !! GaussLegendreRadauRight - !! GaussChebyshev - !! GaussChebyshevLobatto - !! GaussChebyshevRadau - !! GaussChebyshevRadauLeft - !! GaussChebyshevRadauRight REAL(DFP), OPTIONAL, INTENT(IN) :: alpha !! Jacobi parameter REAL(DFP), OPTIONAL, INTENT(IN) :: beta !! Jacobi parameter REAL(DFP), OPTIONAL, INTENT(IN) :: lambda !! Ultraspherical parameter - END SUBROUTINE quad_initiate5 + END SUBROUTINE Initiate END INTERFACE Initiate ``` -:::note `quadratureType` -::: - -Type of quadrature points: - -- GaussLegendre -- GaussLegendreLobatto -- GaussLegendreRadau, GaussLegendreRadauLeft -- GaussLegendreRadauRight -- GaussChebyshev -- GaussChebyshevLobatto -- GaussChebyshevRadau, GaussChebyshevRadauLeft -- GaussChebyshevRadauRight -- GaussJacobi -- GaussJacobiLobatto -- GaussJacobiRadau, GaussJacobiRadauLeft -- GaussJacobiRadauRight -- GaussUltraspherical -- GaussUltrasphericalLobatto -- GaussUltrasphericalRadau, GaussUltraspericalRadauLeft -- GaussUltrasphericalRadauRight - -In the case of `Jacobi` `alpha` and `beta` should be given, and in the case of `Ultraspherical` `lambda` should be given. - - - - - -import EXAMPLE111 from "./_Initiate_test_1a.md"; +| Argument | Type | Intent | Optional | Description | +| -------------- | ------------------------ | ------ | -------- | ----------------------------------------------------------------- | +| obj | TYPE(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| refElem | CLASS(ReferenceElement_) | IN | No | Reference element | +| order | INTEGER(I4B) | IN | No | Order of integrand | +| quadratureType | INTEGER(I4B) | IN | No | Type of quadrature points (integer enumeration) | +| alpha | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| beta | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| lambda | REAL(DFP) | IN | Yes | Ultraspherical parameter (required for Ultraspherical quadrature) | - +### Example - - - - - - +- See the example given in the interface 1 ## Interface 4 +- This inteface is similar to the Interface 3, but in this interface the number of integration points is given. +- This interface is simular to the Interface 2, but in this interface quadratureType are in integer. + ```fortran INTERFACE Initiate - MODULE SUBROUTINE quad_initiate6( & - & obj, & - & refElem, & - & nips, & - & quadratureType, & - & alpha, & - & beta, & - & lambda) + MODULE SUBROUTINE Initiate(obj, refElem, nips, quadratureType, alpha, beta, lambda) TYPE(QuadraturePoint_), INTENT(INOUT) :: obj !! Total number of xidimension CLASS(ReferenceElement_), INTENT(IN) :: refElem @@ -206,40 +142,35 @@ INTERFACE Initiate !! order of integrand INTEGER(I4B), INTENT(IN) :: quadratureType !! Type of quadrature points - !! GaussLegendre - !! GaussLegendreLobatto - !! GaussLegendreRadau - !! GaussLegendreRadauLeft - !! GaussLegendreRadauRight - !! GaussChebyshev - !! GaussChebyshevLobatto - !! GaussChebyshevRadau - !! GaussChebyshevRadauLeft - !! GaussChebyshevRadauRight REAL(DFP), OPTIONAL, INTENT(IN) :: alpha !! Jacobi parameter REAL(DFP), OPTIONAL, INTENT(IN) :: beta !! Jacobi parameter REAL(DFP), OPTIONAL, INTENT(IN) :: lambda !! Ultraspherical parameter - END SUBROUTINE quad_initiate6 + END SUBROUTINE Initiate END INTERFACE Initiate ``` +| Argument | Type | Intent | Optional | Description | +| -------------- | ------------------------ | ------ | -------- | ----------------------------------------------------------------- | +| obj | TYPE(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| refElem | CLASS(ReferenceElement_) | IN | No | Reference element | +| nips | INTEGER(I4B) | IN | No | Number of integration points (array of size 1) | +| quadratureType | INTEGER(I4B) | IN | No | Type of quadrature points (integer enumeration) | +| alpha | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| beta | REAL(DFP) | IN | Yes | Jacobi parameter (required for Jacobi quadrature) | +| lambda | REAL(DFP) | IN | Yes | Ultraspherical parameter (required for Ultraspherical quadrature) | + ## Interface 5 +- This inteface is mainly for cartesian elements. In this interface you can specify order of integrand in each direction. +- The method returns the quadrature points which are obtained by the outer product of the quadrature points in each direction. + ```fortran INTERFACE Initiate - MODULE SUBROUTINE quad_initiate7( & - & obj, & - & refElem, & - & p, q, r, & - & quadratureType1, & - & quadratureType2, & - & quadratureType3, & - & alpha1, beta1, lambda1, & - & alpha2, beta2, lambda2, & - & alpha3, beta3, lambda3) + MODULE SUBROUTINE quad_initiate7(obj, refElem, p, q, r, quadratureType1, quadratureType2, quadratureType3, & + alpha1, beta1, lambda1, alpha2, beta2, lambda2, alpha3, beta3, lambda3) TYPE(QuadraturePoint_), INTENT(INOUT) :: obj !! Total number of xidimension CLASS(ReferenceElement_), INTENT(IN) :: refElem @@ -252,16 +183,6 @@ INTERFACE Initiate !! order of integrand in z direction INTEGER(I4B), INTENT(IN) :: quadratureType1 !! Type of quadrature points - !! GaussLegendre - !! GaussLegendreLobatto - !! GaussLegendreRadau - !! GaussLegendreRadauLeft - !! GaussLegendreRadauRight - !! GaussChebyshev - !! GaussChebyshevLobatto - !! GaussChebyshevRadau - !! GaussChebyshevRadauLeft - !! GaussChebyshevRadauRight INTEGER(I4B), INTENT(IN) :: quadratureType2 !! Type of quadrature points INTEGER(I4B), INTENT(IN) :: quadratureType3 @@ -276,22 +197,28 @@ INTERFACE Initiate END INTERFACE Initiate ``` +| Argument | Type | Intent | Optional | Description | +| ---------------------- | ------------------------ | ------ | -------- | --------------------------------------------- | +| obj | TYPE(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| refElem | CLASS(ReferenceElement_) | IN | No | Reference element | +| p | INTEGER(I4B) | IN | No | Order of integrand in x direction | +| q | INTEGER(I4B) | IN | No | Order of integrand in y direction | +| r | INTEGER(I4B) | IN | No | Order of integrand in z direction | +| quadratureType1 | INTEGER(I4B) | IN | No | Type of quadrature points for x direction | +| quadratureType2 | INTEGER(I4B) | IN | No | Type of quadrature points for y direction | +| quadratureType3 | INTEGER(I4B) | IN | No | Type of quadrature points for z direction | +| alpha1, beta1, lambda1 | REAL(DFP) | IN | Yes | Parameters for x direction quadrature | +| alpha2, beta2, lambda2 | REAL(DFP) | IN | Yes | Parameters for y direction quadrature | +| alpha3, beta3, lambda3 | REAL(DFP) | IN | Yes | Parameters for z direction quadrature | + ## Interface 6 +This interface is similar to the Interface 5, but in this interface the number of integration points is given. + ```fortran INTERFACE Initiate - MODULE SUBROUTINE quad_initiate8( & - & obj, & - & refElem, & - & nipsx, & - & nipsy, & - & nipsz, & - & quadratureType1, & - & quadratureType2, & - & quadratureType3, & - & alpha1, beta1, lambda1, & - & alpha2, beta2, lambda2, & - & alpha3, beta3, lambda3) + MODULE SUBROUTINE quad_initiate8(obj, refElem, nipsx, nipsy, nipsz, quadratureType1, quadratureType2, quadratureType3, & + alpha1, beta1, lambda1, alpha2, beta2, lambda2, alpha3, beta3, lambda3) TYPE(QuadraturePoint_), INTENT(INOUT) :: obj !! Total number of xidimension CLASS(ReferenceElement_), INTENT(IN) :: refElem @@ -304,16 +231,6 @@ INTERFACE Initiate !! number of integration points in z direction INTEGER(I4B), INTENT(IN) :: quadratureType1 !! Type of quadrature points - !! GaussLegendre - !! GaussLegendreLobatto - !! GaussLegendreRadau - !! GaussLegendreRadauLeft - !! GaussLegendreRadauRight - !! GaussChebyshev - !! GaussChebyshevLobatto - !! GaussChebyshevRadau - !! GaussChebyshevRadauLeft - !! GaussChebyshevRadauRight INTEGER(I4B), INTENT(IN) :: quadratureType2 !! Type of quadrature points INTEGER(I4B), INTENT(IN) :: quadratureType3 @@ -328,12 +245,30 @@ INTERFACE Initiate END INTERFACE Initiate ``` +| Argument | Type | Intent | Optional | Description | +| ---------------------- | ------------------------ | ------ | -------- | ------------------------------------------------------------- | +| obj | TYPE(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| refElem | CLASS(ReferenceElement_) | IN | No | Reference element | +| nipsx | INTEGER(I4B) | IN | No | Number of integration points in x direction (array of size 1) | +| nipsy | INTEGER(I4B) | IN | No | Number of integration points in y direction (array of size 1) | +| nipsz | INTEGER(I4B) | IN | No | Number of integration points in z direction (array of size 1) | +| quadratureType1 | INTEGER(I4B) | IN | No | Type of quadrature points for x direction | +| quadratureType2 | INTEGER(I4B) | IN | No | Type of quadrature points for y direction | +| quadratureType3 | INTEGER(I4B) | IN | No | Type of quadrature points for z direction | +| alpha1, beta1, lambda1 | REAL(DFP) | IN | Yes | Parameters for x direction quadrature | +| alpha2, beta2, lambda2 | REAL(DFP) | IN | Yes | Parameters for y direction quadrature | +| alpha3, beta3, lambda3 | REAL(DFP) | IN | Yes | Parameters for z direction quadrature | + ## Interface 7 +:::caution +This routine is for developers only, normal user should not worry about this interface. +::: + ```fortran -MODULE PURE SUBROUTINE Initiate( obj, Points ) - CLASS( QuadraturePoint_ ), INTENT( INOUT ) :: obj - REAL( DFP ), INTENT( IN ) :: Points( :, : ) +MODULE PURE SUBROUTINE Initiate(obj, Points) + CLASS(QuadraturePoint_), INTENT(INOUT) :: obj + REAL(DFP), INTENT(IN) :: Points(:, :) !! Points contains the quadrature points and weights !! Points( :, ipoint ) contains quadrature points and weights of ipoint !! quadrature point. The last row contains the weight. The rest of the @@ -341,6 +276,11 @@ MODULE PURE SUBROUTINE Initiate( obj, Points ) END SUBROUTINE Initiate ``` +| Argument | Type | Intent | Optional | Description | +| -------- | ----------------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------------- | +| obj | CLASS(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| Points | REAL(DFP) | IN | No | Matrix containing quadrature points and weights. Last row contains weights, other rows contain coordinates. | + This subroutine converts the quadrature points into `QuadraturePoint_` data type. :::caution @@ -357,33 +297,37 @@ This routine is for developers only, normal user should not worry about this int ## Interface 8 - developers only +:::caution +This routine is for developers only, normal user should not worry about this interface. +::: ```fortran -MODULE PURE SUBROUTINE Initiate( obj, tXi, tPoints ) - CLASS( QuadraturePoint_ ), INTENT( INOUT ) :: obj - INTEGER( I4B ), INTENT( IN ) :: tXi +MODULE PURE SUBROUTINE Initiate(obj, tXi, tPoints) + CLASS(QuadraturePoint_), INTENT(INOUT) :: obj + INTEGER(I4B), INTENT(IN) :: tXi !! Total number of xidimension !! For line tXi=1 !! For 2D element tXi=2 !! For 3D element tXi=3 - INTEGER( I4B ), INTENT( IN ) :: tPoints + INTEGER(I4B), INTENT(IN) :: tPoints !! Total number quadrature points END SUBROUTINE Initiate ``` -The following interface allocates the memory for storing the quadrature points. +| Argument | Type | Intent | Optional | Description | +| -------- | ----------------------- | ------ | -------- | --------------------------------------------------------------------------- | +| obj | CLASS(QuadraturePoint_) | INOUT | No | The quadrature point object to be initialized | +| tXi | INTEGER(I4B) | IN | No | Total number of dimensions (1 for line, 2 for 2D element, 3 for 3D element) | +| tPoints | INTEGER(I4B) | IN | No | Total number of quadrature points | -:::caution -This routine is for developers only, normal user should not worry about this interface. -::: +The following interface allocates the memory for storing the quadrature points. ## QuadraturePoint (Constructor function) ```fortran -MODULE PURE FUNCTION QuadraturePoint( Points ) RESULT( obj ) - TYPE( QuadraturePoint_ ) :: obj - REAL( DFP ), INTENT( IN ) :: Points( :, : ) +MODULE PURE FUNCTION QuadraturePoint(Points) RESULT(obj) + TYPE(QuadraturePoint_) :: obj + REAL(DFP), INTENT(IN) :: Points(:, :) END FUNCTION QuadraturePoint ``` @@ -392,8 +336,8 @@ This function converts `Points` to an instance of QuadraturePoint. ## QuadraturePoint_Pointer ```fortran -MODULE PURE FUNCTION QuadraturePoint_Pointer( Points ) RESULT( obj ) - CLASS( QuadraturePoint_ ), POINTER :: obj - REAL( DFP ), INTENT( IN ) :: Points( :, : ) +MODULE PURE FUNCTION QuadraturePoint_Pointer(Points) RESULT(obj) + CLASS(QuadraturePoint_), POINTER :: obj + REAL(DFP), INTENT(IN) :: Points(:, :) END FUNCTION QuadraturePoint_Pointer ``` diff --git a/docs/docs-api/QuadraturePoint/MdEncode.md b/docs/docs-api/QuadraturePoint/MdEncode.md index ce337fd6..48f464c1 100644 --- a/docs/docs-api/QuadraturePoint/MdEncode.md +++ b/docs/docs-api/QuadraturePoint/MdEncode.md @@ -15,6 +15,6 @@ END INTERFACE MdEncode ## Example -import EXAMPLE18 from "./_MdEncode_test_1.md"; +import EXAMPLE18 from "./examples/_MdEncode_test_1.md"; diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1a.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1a.md deleted file mode 100644 index c98fd92c..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1a.md +++ /dev/null @@ -1,17 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order - -refelem = ReferenceLine(nsd=1_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1b.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1b.md deleted file mode 100644 index 48c4ab17..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1b.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line("UNIT")) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1c.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1c.md deleted file mode 100644 index 3a9291cf..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1c.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendreLobatto) -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1d.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1d.md deleted file mode 100644 index 76393d16..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1d.md +++ /dev/null @@ -1,17 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE - -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType="GaussLegendre") -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1e.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1e.md deleted file mode 100644 index 9c451162..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1e.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line("UNIT")) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType="GaussLegendre") -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1f.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1f.md deleted file mode 100644 index 035c1702..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1f.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType="GaussLegendreLobatto") -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1g.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1g.md deleted file mode 100644 index 0e48a5b3..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1g.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendreRadauLeft) -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_1h.md b/docs/docs-api/QuadraturePoint/_Initiate_test_1h.md deleted file mode 100644 index c607f1ee..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_1h.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendreRadauRight) -CALL display(mdencode(obj), "") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_2a.md b/docs/docs-api/QuadraturePoint/_Initiate_test_2a.md deleted file mode 100644 index 3aa921ce..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_2a.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceTriangle_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceTriangle(nsd=2_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(mdencode(obj), "" ) -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_2b.md b/docs/docs-api/QuadraturePoint/_Initiate_test_2b.md deleted file mode 100644 index fbc32a0a..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_2b.md +++ /dev/null @@ -1,30 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceTriangle_) :: refelem -INTEGER(I4B) :: order - -refelem = ReferenceTriangle(nsd=2_I4B, xij=RefCoord_Triangle("BIUNIT")) -order = 4_I4B -CALL Initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL Display(mdencode(obj) , "") -END PROGRAM main -``` - -
-See results -
- -| | | | | | | | -| -- | -------- | -------- | -------- | -------- | ------- | -------- | -| x1 | -0.81685 | 0.6337 | -0.81685 | -0.1081 | -0.1081 | -0.78379 | -| x2 | -0.81685 | -0.81685 | 0.6337 | -0.78379 | -0.1081 | -0.1081 | -| w | 0.2199 | 0.2199 | 0.2199 | 0.44676 | 0.44676 | 0.44676 | - -
-
diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_2c.md b/docs/docs-api/QuadraturePoint/_Initiate_test_2c.md deleted file mode 100644 index bfe65854..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_2c.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceTriangle_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceTriangle(nsd=2_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType="GaussLegendre") -CALL display(obj, "ans: ") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_2d.md b/docs/docs-api/QuadraturePoint/_Initiate_test_2d.md deleted file mode 100644 index 82237180..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_2d.md +++ /dev/null @@ -1,16 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceTriangle_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceTriangle(nsd=2_I4B, xij=RefCoord_Triangle("BIUNIT")) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType="GaussLegendre") -CALL display(obj, "ans: ") -END PROGRAM main -``` diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_3a.md b/docs/docs-api/QuadraturePoint/_Initiate_test_3a.md deleted file mode 100644 index cd4a0d01..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_3a.md +++ /dev/null @@ -1,29 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceQuadrangle_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceQuadrangle(nsd=2_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(mdencode(obj) , "") -END PROGRAM main -``` - -
-See results -
- -| | | | | | | | | | | -| -- | ------- | ----------- | ------- | ---------- | ----------- | ----------- | ------- | ----------- | ------- | -| x1 | -0.7746 | -0.7746 | -0.7746 | 4.3715E-16 | 3.88578E-16 | 4.44089E-16 | 0.7746 | 0.7746 | 0.7746 | -| x2 | -0.7746 | 4.44089E-16 | 0.7746 | -0.7746 | 3.88578E-16 | 0.7746 | -0.7746 | 4.16334E-16 | 0.7746 | -| w | 0.30864 | 0.49383 | 0.30864 | 0.49383 | 0.79012 | 0.49383 | 0.30864 | 0.49383 | 0.30864 | - -
-
diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_3b.md b/docs/docs-api/QuadraturePoint/_Initiate_test_3b.md deleted file mode 100644 index f658f713..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_3b.md +++ /dev/null @@ -1,31 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceQuadrangle_) :: refelem -INTEGER(I4B) :: order - -refelem = ReferenceQuadrangle(nsd=2_I4B, xij=RefCoord_Quadrangle("UNIT")) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(mdencode(obj), "") - -END PROGRAM main -``` - -
-See results -
- -| | | | | | | | | | | -| -- | ----------- | ------- | ----------- | ------- | ------- | ------- | ----------- | ------- | ----------- | -| x1 | 0.1127 | 0.1127 | 0.1127 | 0.5 | 0.5 | 0.5 | 0.8873 | 0.8873 | 0.8873 | -| x2 | 0.1127 | 0.5 | 0.8873 | 0.1127 | 0.5 | 0.8873 | 0.1127 | 0.5 | 0.8873 | -| w | 7.71605E-02 | 0.12346 | 7.71605E-02 | 0.12346 | 0.19753 | 0.12346 | 7.71605E-02 | 0.12346 | 7.71605E-02 | - -
-
diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_3c.md b/docs/docs-api/QuadraturePoint/_Initiate_test_3c.md deleted file mode 100644 index 3cbd5026..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_3c.md +++ /dev/null @@ -1,33 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceQuadrangle_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceQuadrangle(nsd=2_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & p=4, & - & q=3, & - & r=1, & - & quadratureType1=GaussLegendre, & - & quadratureType2=GaussLegendre, & - & quadratureType3=GaussLegendre ) -CALL display(mdencode(obj) , "") -END PROGRAM main -``` - -
-See results -
- -| | | | | | | | -| -- | -------- | ------- | ----------- | ----------- | -------- | ------- | -| x1 | -0.7746 | -0.7746 | 3.60822E-16 | 3.33067E-16 | 0.7746 | 0.7746 | -| x2 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -| w | 0.55556 | 0.55556 | 0.88889 | 0.88889 | 0.55556 | 0.55556 | - -
-
diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_4a.md b/docs/docs-api/QuadraturePoint/_Initiate_test_4a.md deleted file mode 100644 index 5b9431cd..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_4a.md +++ /dev/null @@ -1,23 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceHexahedron_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceHexahedron(nsd=3_I4B) -order = 2_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(mdencode(obj), "ans: ") -END PROGRAM main -``` - -| | | | | | | | | | -| -- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | ------- | -| x1 | -0.57735 | -0.57735 | -0.57735 | -0.57735 | 0.57735 | 0.57735 | 0.57735 | 0.57735 | -| x2 | -0.57735 | -0.57735 | 0.57735 | 0.57735 | -0.57735 | -0.57735 | 0.57735 | 0.57735 | -| x3 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -| w | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_4b.md b/docs/docs-api/QuadraturePoint/_Initiate_test_4b.md deleted file mode 100644 index 5c230b4b..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_4b.md +++ /dev/null @@ -1,23 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceHexahedron_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceHexahedron(nsd=3_I4B, xij=RefCoord_Hexahedron("UNIT")) -order = 2_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(mdencode(obj) , "") -END PROGRAM main -``` - -| | | | | | | | | | -| -- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -| x1 | 0.21132 | 0.21132 | 0.21132 | 0.21132 | 0.78868 | 0.78868 | 0.78868 | 0.78868 | -| x2 | 0.21132 | 0.21132 | 0.78868 | 0.78868 | 0.21132 | 0.21132 | 0.78868 | 0.78868 | -| x3 | 0.21132 | 0.78868 | 0.21132 | 0.78868 | 0.21132 | 0.78868 | 0.21132 | 0.78868 | -| w | 0.125 | 0.125 | 0.125 | 0.125 | 0.125 | 0.125 | 0.125 | 0.125 | diff --git a/docs/docs-api/QuadraturePoint/_Initiate_test_4c.md b/docs/docs-api/QuadraturePoint/_Initiate_test_4c.md deleted file mode 100644 index 3cb7fecf..00000000 --- a/docs/docs-api/QuadraturePoint/_Initiate_test_4c.md +++ /dev/null @@ -1,27 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceHexahedron_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceHexahedron(nsd=3_I4B) -CALL initiate(obj=obj, & - & refelem=refelem, & - & p=4, & - & q=3, & - & r=2, & - & quadratureType1=GaussLegendre, & - & quadratureType2=GaussLegendre, & - & quadratureType3=GaussLegendre & - & ) -CALL display(mdencode(obj) , "") -END PROGRAM main -``` - -| | | | | | | | | | | | | | -| -- | -------- | -------- | -------- | ------- | ----------- | ----------- | ----------- | ----------- | -------- | -------- | -------- | ------- | -| x1 | -0.7746 | -0.7746 | -0.7746 | -0.7746 | 3.64292E-16 | 3.46945E-16 | 3.46945E-16 | 3.88578E-16 | 0.7746 | 0.7746 | 0.7746 | 0.7746 | -| x2 | -0.57735 | -0.57735 | 0.57735 | 0.57735 | -0.57735 | -0.57735 | 0.57735 | 0.57735 | -0.57735 | -0.57735 | 0.57735 | 0.57735 | -| x3 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -0.57735 | 0.57735 | -| w | 0.55556 | 0.55556 | 0.55556 | 0.55556 | 0.88889 | 0.88889 | 0.88889 | 0.88889 | 0.55556 | 0.55556 | 0.55556 | 0.55556 | diff --git a/docs/docs-api/QuadraturePoint/_MdEncode_test_1.md b/docs/docs-api/QuadraturePoint/_MdEncode_test_1.md deleted file mode 100644 index 35452a19..00000000 --- a/docs/docs-api/QuadraturePoint/_MdEncode_test_1.md +++ /dev/null @@ -1,21 +0,0 @@ -```fortran -PROGRAM main -USE easifemBase -IMPLICIT NONE -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -refelem = ReferenceLine(nsd=1_I4B) -order = 4_I4B -CALL initiate(obj=obj, & - & refelem=refelem, & - & order=order, & - & quadratureType=GaussLegendre) -CALL display(MdEncode(obj) , "ans: " // char_lf // char_lf) -END PROGRAM main -``` - -| | | | | -| -- | ------- | ----------- | ------- | -| x1 | -0.7746 | 1.59632E-16 | 0.7746 | -| w | 0.55556 | 0.88889 | 0.55556 | diff --git a/docs/docs-api/QuadraturePoint/_Outerprod_test_1.md b/docs/docs-api/QuadraturePoint/_Outerprod_test_1.md deleted file mode 100644 index af9fc5b5..00000000 --- a/docs/docs-api/QuadraturePoint/_Outerprod_test_1.md +++ /dev/null @@ -1,49 +0,0 @@ -In this module we test `Outerprod` method on quadrature point data type. This method can be used to construct quadrature point on quadrangle by performing tensor product of quadrature point on 1D. - -```fortran -PROGRAM main -USE easifemBase -type( ReferenceLine_ ) :: refelem -type( QuadraturePoint_ ) :: obj1, obj2, obj3 -!! -call initiate( obj=refelem, nsd = 1 ) -!! -obj1 = GaussLegendreQuadrature(refelem=refelem, nips=[2]) -obj2 = GaussLegendreQuadrature(refelem=refelem, nips=[2]) -obj3 = Outerprod(obj1, obj2) -!! -call display( obj1, "obj1, Line=") -call display( obj2, "obj2, Line==") -call display( obj3, "obj3, Line=") -!! -END PROGRAM main -``` - -
-See results -
- -```txt -obj1, Line= - # points : ------------------- --0.57735 0.57735 - 1.00000 1.00000 -# txi :1 -obj2, Line== - # points : ------------------- --0.57735 0.57735 - 1.00000 1.00000 -# txi :1 -obj3, Line= - # points : --------------------------------------- --0.57735 -0.57735 0.57735 0.57735 --0.57735 0.57735 -0.57735 0.57735 - 1.00000 1.00000 1.00000 1.00000 -# txi :2 -``` - -
-
diff --git a/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.F90 b/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.F90 index b7ccecad..65b68bca 100644 --- a/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.F90 +++ b/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.F90 @@ -1,3 +1,11 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-17 +! summary: This program tests the Initiate method of the QuadraturePoint_ class. +! It runs five tests with different quadrature types and reference line domains: +! GaussLegendre (BIUNIT, UNIT), GaussLegendreLobatto (BIUNIT), +! GaussLegendreRadauLeft (BIUNIT), and GaussLegendreRadauRight (BIUNIT). +! Only Line elements are tested in this example. + PROGRAM main USE GlobalData USE QuadraturePoint_Method @@ -9,53 +17,138 @@ PROGRAM main TYPE(QuadraturePoint_) :: obj TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -INTEGER(I4B) :: quadratureType -CHARACTER(:), ALLOCATABLE :: test_name, domainName - -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendre -test_name = "order="//tostring(order)//" quadratureType=GaussLegendre"// & - " refelemDomain="//domainName -CALL call_test - -domainName = "UNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendre -test_name = "order="//tostring(order)//" quadratureType=GaussLegendre"// & - " refelemDomain="//domainName -CALL call_test - -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendreLobatto +INTEGER(I4B) :: order, nip(1), quadratureType +CHARACTER(:), ALLOCATABLE :: test_name, domainName, quadratureTypeChar + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +! This subroutine tests the Initiate method with GaussLegendre quadrature +! on a reference line in the BIUNIT domain. +! It initializes the QuadraturePoint_ object and displays the results. + +SUBROUTINE test1 + domainName = "BIUNIT" + refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) + order = 4_I4B + quadratureType = GaussLegendre + quadratureTypeChar = "GaussLegendre" + nip(1) = 3 + test_name = "order="//tostring(order)//" quadratureType=GaussLegendre"// & + " refelemDomain="//domainName + + CALL Initiate(obj=obj, refelem=refelem, order=order, & + quadratureType=quadratureType) + + CALL BlankLines() + CALL Display(obj, test_name) + CALL BlankLines() + + ! In the above interface we are creating quadrature points of + ! given accuracy. We can also specify the number of quadrature point + ! as show below + CALL Initiate(obj=obj, refelem=refelem, nips=nip, & + quadratureType=quadratureType) + + ! We can also specify quadratureType as string + CALL Initiate(obj=obj, refelem=refelem, order=order, & + quadratureType=quadratureTypeChar) + + CALL Initiate(obj=obj, refelem=refelem, nips=nip, & + quadratureType=quadratureTypeChar) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + + domainName = "UNIT" + refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) + order = 4_I4B + quadratureType = GaussLegendre + test_name = "order="//tostring(order)//" quadratureType=GaussLegendre"// & + " refelemDomain="//domainName + + CALL Initiate(obj=obj, refelem=refelem, order=order, & + quadratureType=quadratureType) + + CALL BlankLines() + CALL Display(obj, test_name) + CALL BlankLines() +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +! This subroutine tests the Initiate method with GaussLegendre quadrature +! on a reference line in the UNIT domain. +! It initializes the QuadraturePoint_ object and displays the results. + +SUBROUTINE test3 + domainName = "BIUNIT" + refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) + order = 4_I4B + quadratureType = GaussLegendreLobatto test_name = "order="//tostring(order)//" quadratureType=GaussLegendreLobatto"// & - " refelemDomain="//domainName -CALL call_test + " refelemDomain="//domainName + + CALL Initiate(obj=obj, refelem=refelem, order=order, & + quadratureType=quadratureType) + + CALL BlankLines() + CALL Display(obj, test_name) + CALL BlankLines() +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendreRadauLeft +! This subroutine tests the Initiate method with GaussLegendreRadauLeft quadrature +! on a reference line in the BIUNIT domain. +! It initializes the QuadraturePoint_ object and displays the results. + +SUBROUTINE test4 + domainName = "BIUNIT" + refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) + order = 4_I4B + quadratureType = GaussLegendreRadauLeft test_name = "order="//tostring(order)//" quadratureType=GaussLegendreRadauLeft"// & - " refelemDomain="//domainName -CALL call_test + " refelemDomain="//domainName -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendreRadauRight -test_name = "order="//tostring(order)//" quadratureType=GaussLegendreRadauRight"// & - " refelemDomain="//domainName -CALL call_test + CALL Initiate(obj=obj, refelem=refelem, order=order, & + quadratureType=quadratureType) -CONTAINS + CALL BlankLines() + CALL Display(obj, test_name) + CALL BlankLines() +END SUBROUTINE test4 -SUBROUTINE call_test +!---------------------------------------------------------------------------- +! test5 +!---------------------------------------------------------------------------- + +! This subroutine tests the Initiate method with GaussLegendreRadauRight quadrature +! on a reference line in the BIUNIT domain. +! It initializes the QuadraturePoint_ object and displays the results. + +SUBROUTINE test5 + domainName = "BIUNIT" + refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) + order = 4_I4B + quadratureType = GaussLegendreRadauRight +test_name = "order="//tostring(order)//" quadratureType=GaussLegendreRadauRight"// & + " refelemDomain="//domainName CALL Initiate(obj=obj, refelem=refelem, order=order, & quadratureType=quadratureType) @@ -63,7 +156,10 @@ SUBROUTINE call_test CALL BlankLines() CALL Display(obj, test_name) CALL BlankLines() +END SUBROUTINE test5 -END SUBROUTINE call_test +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- END PROGRAM main diff --git a/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.md b/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.md index 3b3306cf..781fb571 100644 --- a/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.md +++ b/docs/docs-api/QuadraturePoint/examples/_Initiate_test_1.md @@ -1,69 +1,5 @@ -PROGRAM main -USE GlobalData -USE QuadraturePoint_Method -USE BaseType -USE Display_Method -USE ReferenceLine_Method +import CodeBlock from '@theme/CodeBlock'; -IMPLICIT NONE +import CodeSnippet from '!!raw-loader!./_Initiate_test_1.F90'; -TYPE(QuadraturePoint_) :: obj -TYPE(ReferenceLine_) :: refelem -INTEGER(I4B) :: order -INTEGER(I4B) :: quadratureType -CHARACTER(:), ALLOCATABLE :: test_name, domainName - -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendre -test_name = "order="//tostring(order)//" quadratureType=GaussLegendre"// & -" refelemDomain="//domainName -CALL call_test - -domainName = "UNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendre -test_name = "order="//tostring(order)//" quadratureType=GaussLegendre"// & -" refelemDomain="//domainName -CALL call_test - -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendreLobatto -test_name = "order="//tostring(order)//" quadratureType=GaussLegendreLobatto"// & -" refelemDomain="//domainName -CALL call_test - -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendreRadauLeft -test_name = "order="//tostring(order)//" quadratureType=GaussLegendreRadauLeft"// & -" refelemDomain="//domainName -CALL call_test - -domainName = "BIUNIT" -refelem = ReferenceLine(nsd=1_I4B, xij=RefCoord_Line(domainName)) -order = 4_I4B -quadratureType = GaussLegendreRadauRight -test_name = "order="//tostring(order)//" quadratureType=GaussLegendreRadauRight"// & -" refelemDomain="//domainName -CALL call_test - -CONTAINS - -SUBROUTINE call_test - -CALL Initiate(obj=obj, refelem=refelem, order=order, & -quadratureType=quadratureType) - -CALL BlankLines() -CALL Display(obj, test_name) -CALL BlankLines() - -END SUBROUTINE call_test - -END PROGRAM main +{CodeSnippet} diff --git a/docs/docs-api/QuadraturePoint/examples/_Initiate_test_2.F90 b/docs/docs-api/QuadraturePoint/examples/_Initiate_test_2.F90 index 2c75be08..cb2b2275 100644 --- a/docs/docs-api/QuadraturePoint/examples/_Initiate_test_2.F90 +++ b/docs/docs-api/QuadraturePoint/examples/_Initiate_test_2.F90 @@ -1,3 +1,9 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-18 +! summary: This program tests the Initiate method of the QuadraturePoint_ class +! for a reference triangle in the BIUNIT domain using GaussLegendre quadrature. +! It initializes the QuadraturePoint_ object and displays the results. + PROGRAM main USE GlobalData USE QuadraturePoint_Method diff --git a/docs/docs-api/QuadraturePoint/examples/runner.toml b/docs/docs-api/QuadraturePoint/examples/runner.toml index 32cfbb14..b046697f 100644 --- a/docs/docs-api/QuadraturePoint/examples/runner.toml +++ b/docs/docs-api/QuadraturePoint/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/quadrature-point/" +BuildDir = "/tmp/easifem-tests/QuadraturePoint" TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/QuadraturePoint/index.md b/docs/docs-api/QuadraturePoint/index.md index e6e691dc..26a70bf4 100644 --- a/docs/docs-api/QuadraturePoint/index.md +++ b/docs/docs-api/QuadraturePoint/index.md @@ -16,9 +16,8 @@ tags: # QuadraturePoint - - -`QuadraturePoint_` data type contains quadrature points and corresponding weight. This data type is helpful in calculating the element shape data and finite element matrix and vector. +`QuadraturePoint_` data type contains quadrature points and corresponding weight. +This data type is helpful in calculating the element shape data and finite element matrix and vector. import EXAMPLE21 from "./QuadraturePoint_.md"; diff --git a/docs/docs-api/ReallocateUtility/examples/_Reallocate_test_2.F90 b/docs/docs-api/ReallocateUtility/examples/_Reallocate_test_2.F90 index c2ae0b92..8ea04d62 100644 --- a/docs/docs-api/ReallocateUtility/examples/_Reallocate_test_2.F90 +++ b/docs/docs-api/ReallocateUtility/examples/_Reallocate_test_2.F90 @@ -8,22 +8,26 @@ PROGRAM main REAL(DFP), ALLOCATABLE :: val(:, :) LOGICAL(LGT) :: isok -CHARACTER(*), PARAMETER :: testname = "Reallocate1" +CHARACTER(*), PARAMETER :: testname = "Reallocate2" CALL Reallocate(val, 10, 4) isok = SIZE(val, 1) .EQ. 10 .AND. SIZE(val, 2) .EQ. 4 CALL OK(isok, testname) CALL Reallocate(val, 20, 4, isExpand=.TRUE., expandFactor=1) -isok = SIZE(val, 1) .EQ. 20 .AND. SIZE(val, 4) .EQ. 4 +isok = SIZE(val, 1) .EQ. 20 .AND. SIZE(val, 2) .EQ. 4 CALL OK(isok, testname) CALL Reallocate(val, 10, 4, isExpand=.TRUE., expandFactor=1) -isok = SIZE(val, 1) .EQ. 20 .AND. SIZE(val, 4) .EQ. 4 +isok = SIZE(val, 1) .EQ. 20 .AND. SIZE(val, 2) .EQ. 4 CALL OK(isok, testname) CALL Reallocate(val, 30, 4, isExpand=.TRUE., expandFactor=2) -isok = SIZE(val, 1) .EQ. 60 .AND. SIZE(val, 2) .EQ. 8 +isok = SIZE(val, 1) .EQ. 60 .AND. SIZE(val, 2) .EQ. 4 +CALL OK(isok, testname) + +CALL Reallocate(val, 30, 8, isExpand=.TRUE., expandFactor=2) +isok = SIZE(val, 1) .EQ. 60 .AND. SIZE(val, 2) .EQ. 16 CALL OK(isok, testname) END PROGRAM main diff --git a/docs/docs-api/ReallocateUtility/examples/_Reallocate_test_3.F90 b/docs/docs-api/ReallocateUtility/examples/_Reallocate_test_3.F90 new file mode 100644 index 00000000..ae092153 --- /dev/null +++ b/docs/docs-api/ReallocateUtility/examples/_Reallocate_test_3.F90 @@ -0,0 +1,32 @@ +PROGRAM main +USE ReallocateUtility +USE GlobalData +USE Display_Method +USE Test_Method + +IMPLICIT NONE + +REAL(DFP), ALLOCATABLE :: val(:, :, :) +LOGICAL(LGT) :: isok +CHARACTER(*), PARAMETER :: testname = "Reallocate3" + +CALL Reallocate(val, 2, 3, 4) +isok = SIZE(val, 1) .EQ. 2 .AND. SIZE(val, 2) .EQ. 3 .AND. SIZE(val, 3) .EQ. 4 +CALL OK(isok, testname) + +CALL Reallocate(val, 2, 3, 8, isExpand=.TRUE., expandFactor=1) +isok = SIZE(val, 1) .EQ. 2 .AND. SIZE(val, 2) .EQ. 3 .AND. SIZE(val, 3) .EQ. 8 +CALL OK(isok, testname) + +CALL Reallocate(val, 2, 3, 8, isExpand=.TRUE., expandFactor=2) +isok = SIZE(val, 1) .EQ. 2 .AND. SIZE(val, 2) .EQ. 3 .AND. SIZE(val, 3) .EQ. 8 +CALL OK(isok, testname) + +CALL Reallocate(val, 2, 3, 4, isExpand=.TRUE., expandFactor=2) +isok = SIZE(val, 1) .EQ. 2 .AND. SIZE(val, 2) .EQ. 3 .AND. SIZE(val, 3) .EQ. 8 +CALL OK(isok, testname) + +CALL Reallocate(val, 4, 6, 4, isExpand=.TRUE., expandFactor=2) +isok = SIZE(val, 1) .EQ. 8 .AND. SIZE(val, 2) .EQ. 12 .AND. SIZE(val, 3) .EQ. 8 +CALL OK(isok, testname) +END PROGRAM main diff --git a/docs/docs-api/ReallocateUtility/examples/runner.toml b/docs/docs-api/ReallocateUtility/examples/runner.toml index 1acebf88..0f9262f1 100644 --- a/docs/docs-api/ReallocateUtility/examples/runner.toml +++ b/docs/docs-api/ReallocateUtility/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/reallocate/" +BuildDir = "/tmp/easifem-tests/ReallocateUtility" TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/ReverseUtility/examples/_ReverseUtility_test_1.F90 b/docs/docs-api/ReverseUtility/examples/_ReverseUtility_test_1.F90 new file mode 100644 index 00000000..cf4767e9 --- /dev/null +++ b/docs/docs-api/ReverseUtility/examples/_ReverseUtility_test_1.F90 @@ -0,0 +1,133 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-10-14 +! summary: ReverseUtility + +PROGRAM main +USE GlobalData, ONLY: DFP +USE ReverseUtility +USE GridPointUtility +USE Display_Method + +IMPLICIT NONE + +CALL test1 +CALL test2 +CALL test3 +CALL test4 +CALL test5 +CALL test6 +CALL test7 +CALL test8 +CALL test9 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + REAL(DFP) :: avec(10) + CALL Display("test1") + avec = Linspace(1.0_DFP, 10.0_DFP, 10) + CALL Reverse(avec, 1, 5) + CALL Display(avec, "avec(1:5): ", full=.TRUE.) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + REAL(DFP) :: avec(10) + CALL Display("test2") + avec = Linspace(1.0_DFP, 10.0_DFP, 10) + CALL Reverse(avec, 3, 5) + CALL Display(avec, "avec(3:5): ", full=.TRUE.) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! test3 +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + REAL(DFP) :: amat(5, 5) + CALL Display("test3") + amat(1:5, 1:5) = RESHAPE(Linspace(1.0_DFP, 25.0_DFP, 25), [5, 5]) + CALL Reverse(amat, 1, 5, 1, 5, dim=2) + CALL Display(amat, "amat(1:5, 1:5): ", full=.TRUE.) +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! test4 +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + REAL(DFP) :: amat(5, 5) + CALL Display("test4") + amat(1:5, 1:5) = RESHAPE(Linspace(1.0_DFP, 25.0_DFP, 25), [5, 5]) + CALL Reverse(amat, 2, 5, 2, 5, dim=2) + CALL Display(amat, "amat(1:5, 1:5): ", full=.TRUE.) +END SUBROUTINE test4 + +!---------------------------------------------------------------------------- +! test5 +!---------------------------------------------------------------------------- + +SUBROUTINE test5 + REAL(DFP) :: amat(5, 5) + CALL Display("test5") + amat(1:5, 1:5) = RESHAPE(Linspace(1.0_DFP, 25.0_DFP, 25), [5, 5]) + CALL Reverse(amat, 1, 5, 1, 5, dim=1) + CALL Display(amat, "amat(1:5, 1:5): ", full=.TRUE.) +END SUBROUTINE test5 + +!---------------------------------------------------------------------------- +! test6 +!---------------------------------------------------------------------------- + +SUBROUTINE test6 + REAL(DFP) :: amat(5, 5) + CALL Display("test6") + amat(1:5, 1:5) = RESHAPE(Linspace(1.0_DFP, 25.0_DFP, 25), [5, 5]) + CALL Reverse(amat, 2, 5, 2, 5, dim=1) + CALL Display(amat, "amat(1:5, 1:5): ", full=.TRUE.) +END SUBROUTINE test6 + +!---------------------------------------------------------------------------- +! test7 +!---------------------------------------------------------------------------- + +SUBROUTINE test7 + REAL(DFP) :: amat(5, 5, 5) + CALL Display("test7") + amat(1:5, 1:5, 1:5) = RESHAPE(Linspace(1.0_DFP, 125.0_DFP, 125), [5, 5, 5]) + CALL Reverse(amat, 1, 5, 1, 5, 1, 5, dim=3) + CALL Display(amat, "amat: ", full=.TRUE.) +END SUBROUTINE test7 + +!---------------------------------------------------------------------------- +! test8 +!---------------------------------------------------------------------------- + +SUBROUTINE test8 + REAL(DFP) :: amat(5, 5, 5) + CALL Display("test8") + amat(1:5, 1:5, 1:5) = RESHAPE(Linspace(1.0_DFP, 125.0_DFP, 125), [5, 5, 5]) + CALL Reverse(amat, 1, 5, 1, 5, 1, 5, dim=2) + CALL Display(amat, "amat: ", full=.TRUE.) +END SUBROUTINE test8 + +!---------------------------------------------------------------------------- +! test9 +!---------------------------------------------------------------------------- + +SUBROUTINE test9 + REAL(DFP) :: amat(5, 5, 5) + CALL Display("test9") + amat(1:5, 1:5, 1:5) = RESHAPE(Linspace(1.0_DFP, 125.0_DFP, 125), [5, 5, 5]) + CALL Reverse(amat, 1, 5, 1, 5, 1, 5, dim=1) + CALL Display(amat, "amat: ", full=.TRUE.) +END SUBROUTINE test9 + +END PROGRAM main diff --git a/docs/docs-api/ReverseUtility/examples/runner.toml b/docs/docs-api/ReverseUtility/examples/runner.toml new file mode 100644 index 00000000..cd033030 --- /dev/null +++ b/docs/docs-api/ReverseUtility/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/ReverseUtility" +TargetLibs = ["easifemBase"] diff --git a/docs/docs-api/STScalarField/ImportFromToml.md b/docs/docs-api/STScalarField/ImportFromToml.md new file mode 100644 index 00000000..1855242b --- /dev/null +++ b/docs/docs-api/STScalarField/ImportFromToml.md @@ -0,0 +1,6 @@ +# ImportFromToml + +This method initiate an instance of `STScalarField` from a TOML file. + + + diff --git a/docs/docs-api/STScalarField/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/STScalarField/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..3fa3fa8a --- /dev/null +++ b/docs/docs-api/STScalarField/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,66 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing import from toml +! In this example we will initiate the fedof outside the ScalarField + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE STScalarField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE TimeFEDOF_Class +USE TimeOpt_Class, ONLY: TimeOpt_, TypeTimeOpt + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/STScalarField.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof +TYPE(STScalarField_) :: obj +TYPE(TimeFEDOF_) :: timefedof +TYPE(HDF5File_) :: meshfile +TYPE(TimeOpt_) :: timeopt + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL timeopt%ImportFromToml(tomlName="timeOpt", & + filename=tomlfilename) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + timefedof=timefedof, & + mesh=mesh, & + timeOpt=timeopt & + ) + +CALL obj%Display("ScalarField obj:") + +CALL timefedof%Display("TimeFEDOF obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL fedof%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/STScalarField/examples/_ImportFromToml_test_2.F90 b/docs/docs-api/STScalarField/examples/_ImportFromToml_test_2.F90 new file mode 100644 index 00000000..0908f930 --- /dev/null +++ b/docs/docs-api/STScalarField/examples/_ImportFromToml_test_2.F90 @@ -0,0 +1,64 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing import from toml +! In this example we will initiate the fedof outside the ScalarField + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE STScalarField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE TimeFEDOF_Class +USE TimeOpt_Class, ONLY: TimeOpt_, TypeTimeOpt + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/STScalarField2.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof +TYPE(STScalarField_) :: obj +TYPE(TimeFEDOF_) :: timefedof +TYPE(HDF5File_) :: meshfile +TYPE(TimeOpt_) :: timeopt + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL timeopt%ImportFromToml(tomlName="timeOpt", & + filename=tomlfilename) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + timefedof=timefedof, & + mesh=mesh, & + timeOpt=timeopt) + +CALL obj%Display("ScalarField obj:") +! CALL timefedof%Display("TimeFEDOF obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL fedof%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/STScalarField/examples/runner.toml b/docs/docs-api/STScalarField/examples/runner.toml new file mode 100644 index 00000000..44a8471c --- /dev/null +++ b/docs/docs-api/STScalarField/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/STScalarField/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/STScalarField/examples/toml/STScalarField.toml b/docs/docs-api/STScalarField/examples/toml/STScalarField.toml new file mode 100644 index 00000000..93ba9b06 --- /dev/null +++ b/docs/docs-api/STScalarField/examples/toml/STScalarField.toml @@ -0,0 +1,35 @@ +[timeOpt] +dt = 0.1 +timeDependency = "Transient" +totalTimeSteps = 10 +startTime = 0.0 +endTime = 1.0 + +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +timefedofName = "time" +# timefedofName contains the name of the subtable which +# contains the timefedof data for this field. + +[field1.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 + +[field1.time] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 diff --git a/docs/docs-api/STScalarField/examples/toml/STScalarField2.toml b/docs/docs-api/STScalarField/examples/toml/STScalarField2.toml new file mode 100644 index 00000000..50938e97 --- /dev/null +++ b/docs/docs-api/STScalarField/examples/toml/STScalarField2.toml @@ -0,0 +1,48 @@ +[timeOpt] +dt = 0.1 +timeDependency = "Transient" +totalTimeSteps = 10 +startTime = 0.0 +endTime = 1.0 + +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +timefedofName = "time" +# timefedofName contains the name of the subtable which +# contains the timefedof data for this field. + +[field1.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 + +[field1.time] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 + +[field1.exact] +name = "exact" +returnType = "Scalar" +argType = "SpaceTime" +numArgs = 2 +numReturns = 1 +luaScript = "./functions.lua" +luaFunctionName = "referenceDisp" +plotWithResult = false +plotErrorNorm = false +errorNorm = false +normType = "L2BO" diff --git a/docs/docs-api/STScalarField/examples/toml/functions.lua b/docs/docs-api/STScalarField/examples/toml/functions.lua new file mode 100644 index 00000000..49657edd --- /dev/null +++ b/docs/docs-api/STScalarField/examples/toml/functions.lua @@ -0,0 +1,64 @@ +function velocityLeft(t) + return 0.0 +end + +function velocityRight(t) + local f = 1.0 + local t0 = 1.0 + local amp = 1.0 + return amp*(2.0*(math.pi*f)^2)*(t-t0)*math.exp(-((math.pi) * f *(t-t0))^2)*(2.0 * ((math.pi) * f *(t-t0))^2-3.0) +end + +function initialVel(x) + return 0.0 +end + +function initialDisp(x) + return 0.0 +end + +function referenceDisp(x,t) + local pi = math.pi + local f = 1.0 + local t0 = 1.0 + local amp = 1.0 + local L = 10.0 + local c = 1.0 + + return amp * (1.0 - 2.0 * (pi * f*(x -L+ c*(t -t0)))^2) * math.exp(-(pi * f *(x-L + c*(t -t0)))^2) +end + + +function referenceVel(x,t) + local pi = math.pi + local f = 1.0 + local t0 = 1.0 + local amp = 1.0 + local L = 10.0 + local c = 1.0 + + return amp * 2.0*((pi*f)^2)*(x -L + c*(t -t0))*math.exp(-(pi * f *(x -L + c*(t -t0)))^2)*(2.0 * (pi * f *(x -L + c*(t -t0)))^2-3.0) +end + +-- function bodyForce(x, t) +-- local E = 2.0 +-- local r = 1.0 +-- local b0 = (E - r) / r +-- local two_pi = 2.0 * math.pi +-- local four_pi_sqr = 4.0 * math.pi * math.pi +-- return b0 * four_pi_sqr * math.sin(two_pi * (t - x)) +-- end + +-- function tractionRight(t) +-- local amp = 1.0 +-- local t0 = 0.0 +-- local omega = 1.0 + +-- if t <= 5e-3 then +-- return amp*math.sin(omega*t - t0) + +-- else +-- return 0.0 +-- end +-- end + diff --git a/docs/docs-api/STVectorField/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/STVectorField/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..fba39ec2 --- /dev/null +++ b/docs/docs-api/STVectorField/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,65 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing import from toml +! In this example we will initiate the fedof outside the STVectorField + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE STVectorField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE TimeFEDOF_Class +USE TimeOpt_Class, ONLY: TimeOpt_, TypeTimeOpt + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/STVectorField.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof +TYPE(STVectorField_) :: obj +TYPE(TimeFEDOF_) :: timefedof +TYPE(HDF5File_) :: meshfile +TYPE(TimeOpt_) :: timeopt + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL timeopt%ImportFromToml(tomlName="timeOpt", & + filename=tomlfilename) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + timefedof=timefedof, & + mesh=mesh, & + timeOpt=timeopt & + ) + +CALL obj%Display("VectorField obj:") +CALL timefedof%Display("TimeFEDOF obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL fedof%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/STVectorField/examples/runner.toml b/docs/docs-api/STVectorField/examples/runner.toml new file mode 100644 index 00000000..4df77003 --- /dev/null +++ b/docs/docs-api/STVectorField/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/STVectorField/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/STVectorField/examples/toml/STVectorField.toml b/docs/docs-api/STVectorField/examples/toml/STVectorField.toml new file mode 100644 index 00000000..e3888d4d --- /dev/null +++ b/docs/docs-api/STVectorField/examples/toml/STVectorField.toml @@ -0,0 +1,35 @@ +[timeOpt] +dt = 0.1 +timeDependency = "Transient" +totalTimeSteps = 10 +startTime = 0.0 +endTime = 1.0 + +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 2 +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +timefedofName = "time" +# timefedofName contains the name of the subtable which +# contains the timefedof data for this field. + +[field1.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 + +[field1.time] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 diff --git a/docs/docs-api/ScalarField/examples/GetMeshField_test_1.vtp b/docs/docs-api/ScalarField/examples/GetMeshField_test_1.vtp new file mode 100644 index 00000000..f0628e24 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/GetMeshField_test_1.vtp @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +_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 + + + diff --git a/docs/docs-api/ScalarField/examples/ImportFromToml1.toml b/docs/docs-api/ScalarField/examples/ImportFromToml1.toml new file mode 100644 index 00000000..10d64c43 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/ImportFromToml1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarField/examples/Set1.toml b/docs/docs-api/ScalarField/examples/Set1.toml new file mode 100644 index 00000000..10d64c43 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/Set1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarField/examples/SetByFunction.toml b/docs/docs-api/ScalarField/examples/SetByFunction.toml new file mode 100644 index 00000000..10d64c43 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/SetByFunction.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarField/examples/_GetFEDOFPointer_test_1.F90 b/docs/docs-api/ScalarField/examples/_GetFEDOFPointer_test_1.F90 new file mode 100644 index 00000000..aa0cb458 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_GetFEDOFPointer_test_1.F90 @@ -0,0 +1,48 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing GetFEDOFPointer method + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE ScalarField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof +TYPE(FEDOF_), POINTER :: fedof_ptr +TYPE(ScalarField_) :: obj +TYPE(HDF5File_) :: meshfile +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/ScalarField.toml" + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer() + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, fedof=fedof, mesh=mesh) + +fedof_ptr => obj%GetFEDOFPointer() +CALL fedof_ptr%Display("FEDOF Pointer:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL fedof%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/ScalarField/examples/_GetFEDOFPointer_test_1.md b/docs/docs-api/ScalarField/examples/_GetFEDOFPointer_test_1.md new file mode 100644 index 00000000..e5fb87fb --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_GetFEDOFPointer_test_1.md @@ -0,0 +1,5 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_GetFEDOFPointer_test_1.md'; + +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_GetMeshField1.toml b/docs/docs-api/ScalarField/examples/_GetMeshField1.toml new file mode 100644 index 00000000..10d64c43 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_GetMeshField1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarField/examples/_GetMeshField2.toml b/docs/docs-api/ScalarField/examples/_GetMeshField2.toml new file mode 100644 index 00000000..50575738 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_GetMeshField2.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Hierarchical" +ipType = "Equidistance" +baseType = "Monomial" +order = 9 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarField/examples/_GetMeshField_test_1.F90 b/docs/docs-api/ScalarField/examples/_GetMeshField_test_1.F90 new file mode 100644 index 00000000..abd367d3 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_GetMeshField_test_1.F90 @@ -0,0 +1,86 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-11-02 +! summary: Testing GetMeshField method + +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 UserFunction_Class +USE FieldOpt_Class, ONLY: TypeFieldOpt +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeFEVariableOpt, & + TypeInterpolationOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + tomlFileName = "./_GetMeshField1.toml", & + engine = TypeEngineOpt%native_serial, & + myName = "main", & + modName = "_GetMeshField_test_1.F90" + +INTEGER(I4B), PARAMETER :: & + nsd = 3, varType = TypeFEVariableOpt%Space, & + fieldType = TypeFieldOpt%normal, & + defineOn = TypeFieldOpt%nodal, & + order(3) = 19, & + ipType(3) = TypeInterpolationOpt%Equidistance + +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(MeshField_) :: nodeCoordField, uMeshField +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u +TYPE(UserFunction_) :: func +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() + +! obj, name, returnType, argType, numArgs, numReturns, luaScript, & +! luaFunctionName, returnShape +CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=4, & + numReturns=1) +CALL func%Set(scalarFunction=scalarFunc) + +CALL u%Set(func=func) + +CALL InitiateInterpolationPoints( & + obj=nodeCoordField, order=order, ipType=ipType, fedof=fedof, & + mesh=mesh, engine=engine) + +CALL u%GetMeshField(meshField=uMeshField, order=order, ipType=ipType) + +CALL uMeshField%WriteData(filename="GetMeshField_test_1.vtp", & + nodeCoordField=nodeCoordField) + +CONTAINS + +!---------------------------------------------------------------------------- +! scalarFunc2 +!---------------------------------------------------------------------------- + +PURE FUNCTION scalarFunc(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ! ans = 1.0_DFP + ans = (x(1) - 0.5_DFP)**2 + (x(2) - 0.5_DFP)**2 + ! ans = y + y**2 + y**3 +END FUNCTION scalarFunc + +END PROGRAM main diff --git a/docs/docs-api/ScalarField/examples/_GetMeshField_test_2.F90 b/docs/docs-api/ScalarField/examples/_GetMeshField_test_2.F90 new file mode 100644 index 00000000..abd367d3 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_GetMeshField_test_2.F90 @@ -0,0 +1,86 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-11-02 +! summary: Testing GetMeshField method + +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 UserFunction_Class +USE FieldOpt_Class, ONLY: TypeFieldOpt +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeFEVariableOpt, & + TypeInterpolationOpt + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: & + tomlFileName = "./_GetMeshField1.toml", & + engine = TypeEngineOpt%native_serial, & + myName = "main", & + modName = "_GetMeshField_test_1.F90" + +INTEGER(I4B), PARAMETER :: & + nsd = 3, varType = TypeFEVariableOpt%Space, & + fieldType = TypeFieldOpt%normal, & + defineOn = TypeFieldOpt%nodal, & + order(3) = 19, & + ipType(3) = TypeInterpolationOpt%Equidistance + +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(MeshField_) :: nodeCoordField, uMeshField +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u +TYPE(UserFunction_) :: func +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() + +! obj, name, returnType, argType, numArgs, numReturns, luaScript, & +! luaFunctionName, returnShape +CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=4, & + numReturns=1) +CALL func%Set(scalarFunction=scalarFunc) + +CALL u%Set(func=func) + +CALL InitiateInterpolationPoints( & + obj=nodeCoordField, order=order, ipType=ipType, fedof=fedof, & + mesh=mesh, engine=engine) + +CALL u%GetMeshField(meshField=uMeshField, order=order, ipType=ipType) + +CALL uMeshField%WriteData(filename="GetMeshField_test_1.vtp", & + nodeCoordField=nodeCoordField) + +CONTAINS + +!---------------------------------------------------------------------------- +! scalarFunc2 +!---------------------------------------------------------------------------- + +PURE FUNCTION scalarFunc(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ! ans = 1.0_DFP + ans = (x(1) - 0.5_DFP)**2 + (x(2) - 0.5_DFP)**2 + ! ans = y + y**2 + y**3 +END FUNCTION scalarFunc + +END PROGRAM main diff --git a/docs/docs-api/ScalarField/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/ScalarField/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..f063ac17 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,31 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing import from toml +! In this example we will initiate the fedof outside the ScalarField + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE GlobalData +USE ScalarField_Class +USE FEDOF_Class +USE Display_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./ImportFromToml1.toml", & + myName = "main", & + modName = "_ImportFromToml_test_1.F90" + +TYPE(FEDomain_) :: dom +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u + +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") + +CALL u%Display(myName//" u: ") +END PROGRAM main diff --git a/docs/docs-api/ScalarField/examples/_ImportFromToml_test_1.md b/docs/docs-api/ScalarField/examples/_ImportFromToml_test_1.md new file mode 100644 index 00000000..31bc8bee --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_ImportFromToml_test_1.md @@ -0,0 +1,11 @@ +import CodeBlock from '@theme/CodeBlock'; + +import CodeSnippet from '!!raw-loader!./_ImportFromToml_test_1.F90'; + +{CodeSnippet} + +The toml file used in this example is as follows: + +import TomlCodeSnippet from '!!raw-loader!./ImportFromToml1.toml'; + +{TomlCodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Initiate_test_1.md b/docs/docs-api/ScalarField/examples/_Initiate_test_1.md index 4052ceb0..781fb571 100644 --- a/docs/docs-api/ScalarField/examples/_Initiate_test_1.md +++ b/docs/docs-api/ScalarField/examples/_Initiate_test_1.md @@ -1,91 +1,5 @@ - +import CodeBlock from '@theme/CodeBlock'; -```fortran -PROGRAM main - USE easifemBase - USE easifemClasses - TYPE( Domain_ ) :: dom - TYPE( ScalarField_ ) :: obj - TYPE( HDF5File_ ) :: meshfile, resultFile - TYPE( ParameterList_ ) :: param - INTEGER( I4B ) :: ierr - CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" -``` +import CodeSnippet from '!!raw-loader!./_Initiate_test_1.F90'; -```fortran title="setScalarFieldParam" -CALL FPL_INIT() -CALL param%initiate() -CALL SetScalarFieldParam( param=param, & - & fieldType=FIELD_TYPE_NORMAL, & - & name="U", & - & engine=engine) -``` - -```fortran title="Initiate" -CALL meshfile%initiate( filename="./mesh.h5", mode="READ" ) -CALL meshfile%open() -CALL dom%initiate( hdf5=meshfile, group="" ) -CALL obj%initiate( param, dom ) -``` - -Let's display the scalar field. - -```fortran -CALL obj%Display("obj = ") -``` - -```txt title="Results" -#obj = -# isInitiated : TRUE -# name :U -# fieldType : NORMAL -# engine :NATIVE_SERIAL -# comm: 0 -# myRank: 0 -# numProcs: 1 -# global_n: 0 -# local_n: 0 -# is: 0 -# ie: 0 -# lis_ptr: 0 -# domain : ASSOCIATED -# domains : NOT ALLOCATED -# tSize : 102 -# # DOF data : -# Total Physical Variables :1 -# Name : U -# Space Components : 1 -# Time Components : 1 -# Total Nodes : 102 -# Storage Format : Nodes -# Value Map : --------------- - 1 - 103 -# VAR :U - DOF-1 , --------, -0.00000, -0.00000, -0.00000, -0.00000, -0.00000, -0.00000, -. -. -. -``` - -```fortran title="Export" -CALL resultFile%initiate( filename="./result.h5", mode="NEW" ) -CALL resultFile%open() -CALL obj%export( hdf5=resultFile, group="/scalarField1") -``` - -```fortran title="Cleanup" - CALL obj%Deallocate(); CALL dom%Deallocate() - CALL meshfile%Deallocate() - CALL resultFile%Deallocate() - CALL param%Deallocate(); CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_SetByFunction_test_1.F90 b/docs/docs-api/ScalarField/examples/_SetByFunction_test_1.F90 new file mode 100644 index 00000000..7a2bf836 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/_SetByFunction_test_1.F90 @@ -0,0 +1,130 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2024-06-05 +! summary: SetByFunction method is tested here + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE AbstractMesh_Class +USE GlobalData +USE ScalarField_Class +USE FEDOF_Class +USE Display_Method +USE ApproxUtility +USE Test_Method +USE UserFunction_Class +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE BaseType, ONLY: TypeInterpolationOpt, & + TypePolynomialOpt, & + TypeQuadratureOpt, & + QuadraturePoint_, & + ElemShapeData_, & + TypeFEVariableOpt, & + iface_ScalarFunction + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./SetByFunction.toml", & + myName = "main", & + modName = "_SetByFunction_test_1.F90" + +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u +TYPE(UserFunction_) :: func + +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() + +CALL test1 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CHARACTER(*), PARAMETER :: testName = "test1()" + INTEGER(I4B) :: ii, tNodes + REAL(DFP) :: areal, ans + ! LOGICAL(LGT) :: isok + + ! obj, name, returnType, argType, numArgs, numReturns, luaScript, & + ! luaFunctionName, returnShape + CALL func%Initiate(name="func1", returnType=TypeFEVariableOpt%scalar, & + argType=TypeFEVariableOpt%space, numArgs=4, & + numReturns=1) + CALL func%Set(scalarFunction=scalarFunc2) + + CALL u%Set(0.0_DFP) + CALL u%Set(func=func) + + tNodes = u%SIZE() + + DO ii = 1, tNodes + areal = REAL(ii, DFP) + CALL u%Get(globalNode=ii, islocal=.TRUE., VALUE=ans) + ! CALL Display(ans, "ans: ") + END DO +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! Contains +!---------------------------------------------------------------------------- + +PURE FUNCTION scalarFunc1(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = 1.0_DFP +END FUNCTION scalarFunc1 + +!---------------------------------------------------------------------------- +! scalarFunc2 +!---------------------------------------------------------------------------- + +PURE FUNCTION scalarFunc2(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ! ans = 1.0_DFP + ans = x(1)**2 + x(2)**2 + ! ans = y + y**2 + y**3 +END FUNCTION scalarFunc2 + +!---------------------------------------------------------------------------- +! scalarFunc3 +!---------------------------------------------------------------------------- + +PURE FUNCTION scalarFunc3(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 +END FUNCTION scalarFunc3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +PURE FUNCTION scalarFunc4(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 +END FUNCTION scalarFunc4 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +PURE FUNCTION scalarFunc5(x) RESULT(ans) + REAL(DFP), OPTIONAL, INTENT(IN) :: x(:) + REAL(DFP) :: ans + ans = x(1) + x(1)**2 + x(1)**3 + x(1)**4 + x(1)**5 +END FUNCTION scalarFunc5 + +END PROGRAM main + diff --git a/docs/docs-api/ScalarField/examples/_Set_test_1.F90 b/docs/docs-api/ScalarField/examples/_Set_test_1.F90 index 15b364e9..35917f99 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_1.F90 +++ b/docs/docs-api/ScalarField/examples/_Set_test_1.F90 @@ -1,113 +1,95 @@ !> author: Vikas Sharma, Ph. D. ! date: 2024-06-05 -! summary: Set1 +! summary: Set1, setting a single value PROGRAM main +USE AbstractField_Class USE FEDomain_Class -USE HDF5File_Class USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ USE GlobalData -USE Test_Method +USE ScalarField_Class USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Display_Method USE ApproxUtility +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./Set1.toml", & + myName = "main", & + modName = "_ImportFromToml_test_1.F90" TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -REAL(DFP), ALLOCATABLE :: realVec(:) -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 -CHARACTER(:), ALLOCATABLE :: msg -INTEGER(I4B) :: localNode -REAL(DFP) :: VALUE, tol -LOGICAL(LGT) :: isok - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set1 " - localNode = 1 - CALL obj%Set(globalnode=localNode, VALUE=100.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(100.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - localNode = 2 - CALL obj%Set(globalnode=localNode, VALUE=200.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(200.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set1 " - localNode = 3 - CALL obj%Set(globalnode=localNode, VALUE=100.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(100.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u + +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() + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CHARACTER(*), PARAMETER :: testName = "test1()" + INTEGER(I4B) :: ii, tNodes + REAL(DFP) :: areal, ans + LOGICAL(LGT) :: isok + + tNodes = u%SIZE() + + DO ii = 1, tNodes + areal = REAL(ii, DFP) + CALL u%Set(globalNode=ii, islocal=.TRUE., VALUE=areal) + CALL u%Get(globalNode=ii, islocal=.TRUE., VALUE=ans) + isok = areal.APPROXEQ.ans + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + RETURN + END IF + END DO + CALL OK(.TRUE., testName) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + CHARACTER(*), PARAMETER :: testName = "test2()" + INTEGER(I4B) :: ii, tNodes + REAL(DFP) :: areal, ans, scale + LOGICAL(LGT) :: isok + + tNodes = u%SIZE() + scale = 2.0_DFP + + DO ii = 1, tNodes + areal = REAL(ii, DFP) + CALL u%Set(globalNode=ii, islocal=.TRUE., VALUE=areal, scale=scale) + CALL u%Get(globalNode=ii, islocal=.TRUE., VALUE=ans) + areal = areal * scale + isok = areal.APPROXEQ.ans + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + RETURN + END IF + END DO + + CALL OK(.TRUE., testName) +END SUBROUTINE test2 + END PROGRAM main + diff --git a/docs/docs-api/ScalarField/examples/_Set_test_1.md b/docs/docs-api/ScalarField/examples/_Set_test_1.md index 72a1a598..2f83fb42 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_1.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_1.md @@ -1,115 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set1 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility +import CodeSnippet from '!!raw-loader!./_Set_test_1.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -REAL(DFP), ALLOCATABLE :: realVec(:) -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 -CHARACTER(:), ALLOCATABLE :: msg -INTEGER(I4B) :: localNode -REAL(DFP) :: VALUE, tol -LOGICAL(LGT) :: isok - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set1 " - localNode = 1 - CALL obj%Set(globalnode=localNode, VALUE=100.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(100.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - localNode = 2 - CALL obj%Set(globalnode=localNode, VALUE=200.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(200.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set1 " - localNode = 3 - CALL obj%Set(globalnode=localNode, VALUE=100.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(100.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Set_test_2.F90 b/docs/docs-api/ScalarField/examples/_Set_test_2.F90 index 1376b5bc..b3adf2f4 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_2.F90 +++ b/docs/docs-api/ScalarField/examples/_Set_test_2.F90 @@ -1,141 +1,97 @@ !> author: Vikas Sharma, Ph. D. ! date: 2024-06-05 -! summary: Set2 +! summary: Set2, setting all the values PROGRAM main +USE AbstractField_Class USE FEDomain_Class -USE HDF5File_Class USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ USE GlobalData -USE Test_Method +USE ScalarField_Class USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Display_Method USE ApproxUtility +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./Set1.toml", & + myName = "main", & + modName = "_ImportFromToml_test_1.F90" TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u + +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() + +CALL test1 +CALL test2 + +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CHARACTER(*), PARAMETER :: testName = "test1()" + INTEGER(I4B) :: ii, tNodes + REAL(DFP) :: areal, ans LOGICAL(LGT) :: isok - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set2 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg + tNodes = u%SIZE() + + areal = 5.0_DFP + CALL u%Set(VALUE=areal) + + DO ii = 1, tNodes + CALL u%Get(globalNode=ii, islocal=.TRUE., VALUE=ans) + isok = areal.APPROXEQ.ans + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + RETURN + END IF + END DO + CALL OK(.TRUE., testName) + +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + CHARACTER(*), PARAMETER :: testName = "test2()" + INTEGER(I4B) :: ii, tNodes + REAL(DFP) :: areal, ans, scale LOGICAL(LGT) :: isok - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set2 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() + tNodes = u%SIZE() + scale = 2.0_DFP + areal = 5.0_DFP + CALL u%Set(VALUE=areal, scale=scale) + + DO ii = 1, tNodes + CALL u%Get(globalNode=ii, islocal=.TRUE., VALUE=ans) + isok = (areal * scale) .APPROXEQ.ans + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + CALL Display(" Expected: "//ToString(areal * scale)// & + " Found: "//ToString(ans)) + RETURN + END IF + END DO + + CALL OK(.TRUE., testName) +END SUBROUTINE test2 + END PROGRAM main + diff --git a/docs/docs-api/ScalarField/examples/_Set_test_2.md b/docs/docs-api/ScalarField/examples/_Set_test_2.md index 63b13351..b5b0f1aa 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_2.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_2.md @@ -1,143 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set2 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility +import CodeSnippet from '!!raw-loader!./_Set_test_2.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set2 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set2 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Set_test_3.F90 b/docs/docs-api/ScalarField/examples/_Set_test_3.F90 index 07b486b3..3eb7b72d 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_3.F90 +++ b/docs/docs-api/ScalarField/examples/_Set_test_3.F90 @@ -1,143 +1,102 @@ !> author: Vikas Sharma, Ph. D. ! date: 2024-06-05 -! summary: Set3 +! summary: Set3, setting all the values using a vector PROGRAM main +USE AbstractField_Class USE FEDomain_Class -USE HDF5File_Class USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ USE GlobalData -USE Test_Method +USE ScalarField_Class USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Display_Method USE ApproxUtility -USE ArangeUtility +USE Test_Method +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./Set1.toml", & + myName = "main", & + modName = "_ImportFromToml_test_1.F90" TYPE(FEDomain_) :: dom CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u + +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() + +CALL test1 +CALL test2 - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set3 " - tsize = obj%SIZE() - VALUE(1:tsize) = arange(1, tsize) - CALL obj%Set(VALUE=VALUE(1:tsize)) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE(1:tsize) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE(1:tsize), scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE(1:tsize) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE(1:tsize), addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg +CONTAINS + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + CHARACTER(*), PARAMETER :: testName = "test1()" + INTEGER(I4B) :: ii, tNodes + REAL(DFP) :: areal, ans LOGICAL(LGT) :: isok + REAL(DFP), ALLOCATABLE :: realVec(:) + + tNodes = u%SIZE() + CALL Reallocate(realVec, tNodes) + CALL RANDOM_NUMBER(realVec) + + CALL u%Set(VALUE=realVec) + + DO ii = 1, tNodes + CALL u%Get(globalNode=ii, islocal=.TRUE., VALUE=ans) + areal = realVec(ii) + isok = areal.APPROXEQ.ans + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + RETURN + END IF + END DO + CALL OK(.TRUE., testName) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test2 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + CHARACTER(*), PARAMETER :: testName = "test2()" + INTEGER(I4B) :: ii, tNodes + REAL(DFP) :: areal, ans, scale + LOGICAL(LGT) :: isok + REAL(DFP), ALLOCATABLE :: realVec(:) + + tNodes = u%SIZE() + CALL Reallocate(realVec, tNodes) + CALL RANDOM_NUMBER(realVec) + CALL u%Set(VALUE=0.0_DFP) + + scale = 2.0_DFP + CALL u%Set(VALUE=realVec, scale=scale, addContribution=.TRUE.) + + DO ii = 1, tNodes + CALL u%Get(globalNode=ii, islocal=.TRUE., VALUE=ans) + areal = realVec(ii) * scale + isok = areal.APPROXEQ.ans + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + RETURN + END IF + END DO + CALL OK(.TRUE., testName) +END SUBROUTINE test2 - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set3 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() END PROGRAM main + diff --git a/docs/docs-api/ScalarField/examples/_Set_test_3.md b/docs/docs-api/ScalarField/examples/_Set_test_3.md index 8a9e9de8..228376b4 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_3.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_3.md @@ -1,145 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set3 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility -USE ArangeUtility +import CodeSnippet from '!!raw-loader!./_Set_test_3.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set3 " - tsize = obj%SIZE() - VALUE(1:tsize) = arange(1, tsize) - CALL obj%Set(VALUE=VALUE(1:tsize)) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE(1:tsize) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE(1:tsize), scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE(1:tsize) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE(1:tsize), addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set3 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Set_test_4.F90 b/docs/docs-api/ScalarField/examples/_Set_test_4.F90 index 9e3cb921..a0e58ddf 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_4.F90 +++ b/docs/docs-api/ScalarField/examples/_Set_test_4.F90 @@ -1,119 +1,131 @@ !> author: Vikas Sharma, Ph. D. ! date: 2024-06-05 -! summary: Set4 +! summary: Set4 and Set5, setting all the values using index PROGRAM main +USE AbstractField_Class USE FEDomain_Class -USE HDF5File_Class USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ USE GlobalData -USE Test_Method +USE ScalarField_Class USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Display_Method USE ApproxUtility +USE Test_Method +USE ReallocateUtility +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok +IMPLICIT NONE - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set4 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE, globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok +CHARACTER(*), PARAMETER :: tomlFileName = "./Set1.toml", & + myName = "main", & + modName = "_ImportFromToml_test_1.F90" - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof, geofedof +TYPE(ScalarField_) :: u - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) +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") - CALL obj%Initiate(param, fedof) +mesh => dom%GetMeshPointer() - localNode = [1, 3, 5] +CALL test1 +CALL test2 - msg = "Set4 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE, globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) +CONTAINS - want = 0.0_DFP - want(localNode) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- - CALL obj%DEALLOCATE() -END BLOCK +SUBROUTINE test1 + CHARACTER(*), PARAMETER :: testName = "test1()" + INTEGER(I4B) :: iel, ii, tNodes, tElements, tcon, maxCon + LOGICAL(LGT) :: isok + REAL(DFP), ALLOCATABLE :: realVec(:), ans(:) + INTEGER(I4B), ALLOCATABLE :: con(:) + + tNodes = u%SIZE() + tElements = mesh%GetTotalElements() + maxCon = fedof%GetMaxTotalConnectivity() + + CALL Reallocate(con, maxCon) + CALL Reallocate(ans, maxCon) + CALL Reallocate(realVec, maxCon) + CALL RANDOM_NUMBER(realVec) + + DO iel = 1, tElements + CALL fedof%GetConnectivity_(ans=con, tsize=tcon, opt="A", & + globalElement=iel, islocal=.TRUE.) + CALL RANDOM_NUMBER(realVec(1:tcon)) + CALL u%Set(VALUE=realVec(1:tcon), globalNode=con(1:tcon), & + islocal=.TRUE.) + CALL u%Get(globalNode=con(1:tcon), islocal=.TRUE., & + VALUE=ans, tsize=tcon) + + DO ii = 1, tcon + isok = realVec(ii) .APPROXEQ.ans(ii) + IF (.NOT. isok) EXIT + END DO + + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + RETURN + END IF + + END DO + CALL OK(.TRUE., testName) +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! test1 +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + CHARACTER(*), PARAMETER :: testName = "test2()" + INTEGER(I4B) :: iel, ii, tNodes, tElements, tcon, maxCon + LOGICAL(LGT) :: isok + REAL(DFP) :: areal + REAL(DFP), ALLOCATABLE :: realVec(:), ans(:) + INTEGER(I4B), ALLOCATABLE :: con(:) + + tNodes = u%SIZE() + tElements = mesh%GetTotalElements() + maxCon = fedof%GetMaxTotalConnectivity() + + CALL Reallocate(con, maxCon) + CALL Reallocate(ans, maxCon) + + DO iel = 1, tElements + CALL fedof%GetConnectivity_(ans=con, tsize=tcon, opt="A", & + globalElement=iel, islocal=.TRUE.) + CALL RANDOM_NUMBER(areal) + CALL u%Set(VALUE=areal, globalNode=con(1:tcon), & + islocal=.TRUE.) + CALL u%Get(globalNode=con(1:tcon), islocal=.TRUE., & + VALUE=ans, tsize=tcon) + + DO ii = 1, tcon + isok = areal.APPROXEQ.ans(ii) + IF (.NOT. isok) EXIT + END DO + + IF (.NOT. isok) THEN + CALL Display("Test Failed in "//testName//": at node "//ToString(ii)) + RETURN + END IF + + END DO + CALL OK(.TRUE., testName) +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() END PROGRAM main + diff --git a/docs/docs-api/ScalarField/examples/_Set_test_4.md b/docs/docs-api/ScalarField/examples/_Set_test_4.md index 41db9ff3..77472c00 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_4.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_4.md @@ -1,121 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set4 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility +import CodeSnippet from '!!raw-loader!./_Set_test_4.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set4 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE, globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set4 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE, globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Set_test_5.F90 b/docs/docs-api/ScalarField/examples/_Set_test_5.F90 index 0f740298..5cc44ae7 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_5.F90 +++ b/docs/docs-api/ScalarField/examples/_Set_test_5.F90 @@ -1,6 +1,6 @@ !> author: Vikas Sharma, Ph. D. ! date: 2024-06-05 -! summary: Set5 +! summary: Testing Set5 PROGRAM main USE FEDomain_Class diff --git a/docs/docs-api/ScalarField/examples/_Set_test_5.md b/docs/docs-api/ScalarField/examples/_Set_test_5.md index 3941d99d..3ef2e4d8 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_5.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_5.md @@ -1,142 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set5 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility +import CodeSnippet from '!!raw-loader!./_Set_test_5.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set5 " - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE., scale=2.0_DFP) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 3 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE.) - - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 4 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set5 " - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Set_test_6.md b/docs/docs-api/ScalarField/examples/_Set_test_6.md index 3941d99d..282154d5 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_6.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_6.md @@ -1,142 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set5 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility +import CodeSnippet from '!!raw-loader!./_Set_test_6.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set5 " - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE., scale=2.0_DFP) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 3 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE.) - - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 4 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set5 " - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Set_test_7.md b/docs/docs-api/ScalarField/examples/_Set_test_7.md index 62803803..27cd929e 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_7.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_7.md @@ -1,98 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set7 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility +import CodeSnippet from '!!raw-loader!./_Set_test_7.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj, VALUE - REAL(DFP) :: found(100), want(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - CALL VALUE%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set7 " - - DO ii = 1, SIZE(localNode) - CALL VALUE%Set(VALUE=REAL(localNode(ii), kind=DFP), & - globalNode=localNode(ii), islocal=.TRUE.) - END DO - - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(0.0_DFP) - obj = VALUE - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/_Set_test_8.md b/docs/docs-api/ScalarField/examples/_Set_test_8.md index dc7ef82f..b41ac475 100644 --- a/docs/docs-api/ScalarField/examples/_Set_test_8.md +++ b/docs/docs-api/ScalarField/examples/_Set_test_8.md @@ -1,97 +1,5 @@ -```fortran -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set8 +import CodeBlock from '@theme/CodeBlock'; -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField -USE ScalarField_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility +import CodeSnippet from '!!raw-loader!./_Set_test_8.F90'; -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = "NATIVE_SERIAL" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarField_) :: obj, VALUE - REAL(DFP) :: found(100), want(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - CALL VALUE%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set8 " - - DO ii = 1, SIZE(localNode) - CALL VALUE%Set(VALUE=REAL(localNode(ii), kind=DFP), & - globalNode=localNode(ii), islocal=.TRUE.) - END DO - - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 3 * localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main -``` +{CodeSnippet} diff --git a/docs/docs-api/ScalarField/examples/mesh/main.F90 b/docs/docs-api/ScalarField/examples/mesh/main.F90 new file mode 100644 index 00000000..cf0cd946 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/mesh/main.F90 @@ -0,0 +1,84 @@ +PROGRAM main +USE Gmsh_Class +USE GlobalData +USE MSHFile_Class +USE HDF5File_Class +USE Display_Method + +TYPE(Gmsh_) :: gmsh + +CHARACTER(LEN=*), PARAMETER :: prefix = "square" +REAL(DFP), PARAMETER :: lx = 1.0_DFP +REAL(DFP), PARAMETER :: ly = 1.0_DFP +INTEGER(I4B), PARAMETER :: order = 1 + +REAL(DFP), PARAMETER :: meshSize = 1.0 +REAL(DFP), PARAMETER :: corner(3) = 0.0_DFP +INTEGER(I4B), PARAMETER :: nnod(2) = [3, 3] +INTEGER(I4B) :: ierr +REAL(DFP) :: x, y, z, lc +CHARACTER(:), ALLOCATABLE :: suffix, title + +TYPE(MSHFile_) :: mshFile +TYPE(HDF5File_) :: hdf5file + +suffix = ToString(nnod(1))//"x"//ToString(nnod(2)) + +title = prefix//"_"//suffix + +ierr = gmsh%Initialize() +ierr = gmsh%model%add(title) + +x = corner(1); y = corner(2); z = corner(3); lc = meshSize +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=1) + +x = x + lx; y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=2) + +x = x; y = y + ly; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=3) + +x = corner(1); y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=4) + +ierr = gmsh%model%geo%addLine(1, 2, 1) +ierr = gmsh%model%geo%addLine(2, 3, 2) +ierr = gmsh%model%geo%addLine(3, 4, 3) +ierr = gmsh%model%geo%addLine(4, 1, 4) + +ierr = gmsh%model%geo%addCurveLoop([1, 2, 3, 4], tag=1) + +ierr = gmsh%model%geo%addPlaneSurface([1], 1) + +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(1, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(3, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(2, nnod(2), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(4, nnod(2), & + "Progression", 1.0_DFP) + +ierr = gmsh%model%geo%mesh%setTransfiniteSurface(1) +ierr = gmsh%model%geo%mesh%setRecombine(2, 1) + +ierr = gmsh%model%geo%synchronize() + +ierr = gmsh%model%mesh%generate(2) + +ierr = gmsh%model%mesh%setOrder(order) + +ierr = gmsh%WRITE(title//'.msh') + +ierr = gmsh%Finalize() + +CALL mshFile%Initiate(filename=title//'.msh', STATUS="OLD", ACTION="READ") +CALL mshFile%OPEN() +CALL mshFile%READ() +CALL hdf5file%Initiate(title//'.h5', MODE="NEW") +CALL hdf5file%OPEN() +CALL mshFile%Export(hdf5=hdf5file, group="") +CALL mshFile%DEALLOCATE() +CALL hdf5file%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/ScalarField/examples/mesh/runner.toml b/docs/docs-api/ScalarField/examples/mesh/runner.toml new file mode 100644 index 00000000..3d324f66 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/mesh/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/MeshField/mesh/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/ScalarField/examples/runner.toml b/docs/docs-api/ScalarField/examples/runner.toml index df0e5aec..64cbad5d 100644 --- a/docs/docs-api/ScalarField/examples/runner.toml +++ b/docs/docs-api/ScalarField/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -BuildDir = "/tmp/easifem-test/" +BuildDir = "/tmp/easifem-tests/ScalarField" TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/ScalarField/examples/toml/ScalarField.toml b/docs/docs-api/ScalarField/examples/toml/ScalarField.toml new file mode 100644 index 00000000..aa1cbc52 --- /dev/null +++ b/docs/docs-api/ScalarField/examples/toml/ScalarField.toml @@ -0,0 +1,13 @@ +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +fedofName = "fedof" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +[field1.fedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 diff --git a/docs/docs-api/ScalarFieldLis/examples/_Export_test_1.md b/docs/docs-api/ScalarFieldLis/examples/_Export_test_1.md new file mode 100644 index 00000000..4e7280a9 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_Export_test_1.md @@ -0,0 +1,92 @@ +In this example we test following methods: + +- [SetScalarFieldParam](./SetScalarFieldParam.md) +- [Initiate](./Initiate.md) +- [Export](./Export.md) + +```fortran +PROGRAM main + USE easifemBase + USE easifemClasses + TYPE( Domain_ ) :: dom + TYPE( ScalarFieldLis_ ) :: obj + TYPE( HDF5File_ ) :: meshfile, resultFile + TYPE( ParameterList_ ) :: param + INTEGER( I4B ) :: ierr + CHARACTER(*), PARAMETER :: engine = "LIS_OMP" +``` + +```fortran title="setScalarFieldParam" +CALL FPL_INIT() +CALL param%initiate() +CALL SetScalarFieldParam( param=param, & + & fieldType=FIELD_TYPE_NORMAL, & + & name="U", & + & engine=engine) +``` + +```fortran title="Initiate" +CALL meshfile%initiate( filename="./mesh.h5", mode="READ" ) +CALL meshfile%open() +CALL dom%initiate( hdf5=meshfile, group="" ) +CALL meshfile%Deallocate() +CALL obj%initiate( param, dom ) +``` + +Let's display the scalar field. + +```fortran +CALL obj%Display("obj = ") +``` + +```txt title="results" +#obj = +# isInitiated : TRUE +# name :U +# fieldType : NORMAL +# engine :LIS_OMP +# comm: 0 +# myRank: 0 +# numProcs: 1 +# global_n: 102 +# local_n: 102 +# is: 1 +# ie: 103 +# lis_ptr: 94802857847760 +# domain : ASSOCIATED +# domains : NOT ALLOCATED +# tSize : 102 +# # DOF data : +# Total Physical Variables :1 +# Name : U +# Space Components : 1 +# Time Components : 1 +# Total Nodes : 102 +# Storage Format : Nodes +# Value Map : +-------------- + 1 + 103 +# VAR :U + DOF-1 , +-------, +0.00000, +0.00000, +0.00000, +0.00000, +0.00000, +0.00000, +``` + +```fortran title="Export" +CALL resultFile%initiate( filename="./result.h5", mode="NEW" ) +CALL resultFile%open() +CALL obj%export( hdf5=resultFile, group="/scalarField1") +CALL resultFile%Deallocate() +``` + +```fortran title="Cleanup" + CALL obj%Deallocate(); CALL dom%Deallocate() + CALL param%Deallocate(); CALL FPL_FINALIZE() +END PROGRAM main +``` diff --git a/docs/docs-api/ScalarFieldLis/examples/_GetMultiple_test_1.F90 b/docs/docs-api/ScalarFieldLis/examples/_GetMultiple_test_1.F90 new file mode 100644 index 00000000..7563aac4 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_GetMultiple_test_1.F90 @@ -0,0 +1,154 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-04 +! summary: GetSingle +! +! INTERFACE +! MODULE SUBROUTINE obj_GetMultiple1(obj, indx, VALUE, tsize) +! CLASS(AbstractNodeField_), INTENT(IN) :: obj +! INTEGER(I4B), INTENT(IN) :: indx(:) +! !! index, size(indx) = size(value) = tsize +! REAL(DFP), INTENT(OUT) :: VALUE(:) +! !! returned vlaue +! INTEGER(I4B), INTENT(OUT) :: tsize +! !! total number of data written in value +! END SUBROUTINE obj_GetMultiple1 +! END INTERFACE +! +! INTERFACE +! MODULE SUBROUTINE obj_GetMultiple2(obj, istart, iend, stride, VALUE, tsize) +! CLASS(AbstractNodeField_), INTENT(IN) :: obj +! INTEGER(I4B), INTENT(IN) :: istart, iend, stride +! !! index, size(indx) = size(value) = tsize +! REAL(DFP), INTENT(OUT) :: VALUE(:) +! !! returned vlaue +! INTEGER(I4B), INTENT(OUT) :: tsize +! !! total number of data written in value +! END SUBROUTINE obj_GetMultiple2 +! END INTERFACE +! +! INTERFACE +! MODULE SUBROUTINE obj_GetMultiple3( & +! obj, istart, iend, stride, VALUE, istart_value, iend_value, & +! stride_value, tsize) +! CLASS(AbstractNodeField_), INTENT(IN) :: obj +! INTEGER(I4B), INTENT(IN) :: istart, iend, stride +! !! index, size(indx) = size(value) = tsize +! REAL(DFP), INTENT(OUT) :: VALUE(:) +! !! returned vlaue +! INTEGER(I4B), INTENT(IN) :: istart_value, iend_value, stride_value +! !! range of values +! INTEGER(I4B), INTENT(OUT) :: tsize +! !! total number of data written in value +! END SUBROUTINE obj_GetMultiple3 +! END INTERFACE + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE GlobalData +USE ScalarField_Class +USE ScalarFieldLis_Class +USE FieldFactory, ONLY: ScalarFieldFactory +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE FEDOF_Class +USE Display_Method +USE BaseType, ONLY: math => TypeMathOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Test_Method +USE ApproxUtility +USE ReallocateUtility, ONLY: Reallocate + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./_GetMultiple_test_1.toml", & + myName = "main", & + modName = "_GetMultiple_test_1.F90", & + engine = "LIS_OMP" +TYPE(FEDomain_) :: dom +TYPE(FEDOF_) :: fedof, geofedof +CLASS(ScalarField_), POINTER :: u + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain") + +u => ScalarFieldFactory(engine) +CALL u%ImportFromToml( & + fedof=fedof, geofedof=geofedof, dom=dom, fileName=tomlFileName, & + tomlName="u") + +CALL test1 +CALL test2 +CALL test3 + +CONTAINS + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B), ALLOCATABLE :: indx(:) + INTEGER(I4B) :: tsize + REAL(DFP), ALLOCATABLE :: found(:), want(:) + LOGICAL(LGT) :: isok + + indx = [1, 3, 5, 7] + want = [10.0, 30.0, 50.0, 70.0] + CALL u%SetMultiple(indx=indx, VALUE=want) + CALL Reallocate(found, SIZE(indx)) + CALL u%GetMultiple(indx=indx, VALUE=found, tsize=tsize) + isok = ALL(want.approxeq.found) + CALL OK(isok, myName//" test1: ") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: istart, iend, stride, tsize + REAL(DFP), ALLOCATABLE :: found(:), want(:) + LOGICAL(LGT) :: isok + + istart = 1 + iend = 7 + stride = 2 + want = [10.0, 30.0, 50.0, 70.0] + CALL u%SetMultiple(istart=istart, iend=iend, stride=stride, VALUE=want) + CALL Reallocate(found, SIZE(want)) + + CALL u%GetMultiple(istart=istart, iend=iend, stride=stride, VALUE=found, & + tsize=tsize) + isok = ALL(want.approxeq.found) + CALL OK(isok, myName//" test2: ") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: istart, iend, stride, tsize + REAL(DFP), ALLOCATABLE :: found(:), want(:) + LOGICAL(LGT) :: isok + + istart = 1 + iend = 7 + stride = 2 + want = [10.0, 30.0, 50.0, 70.0] + CALL u%SetMultiple(istart=istart, iend=iend, stride=stride, VALUE=want) + CALL Reallocate(found, 4) + + CALL u%GetMultiple( & + istart=istart, iend=iend, stride=stride, VALUE=found, tsize=tsize, & + istart_value=1, iend_value=4, stride_value=1) + + isok = ALL(want.approxeq.found) + CALL OK(isok, myName//" test3: ") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_GetMultiple_test_1.toml b/docs/docs-api/ScalarFieldLis/examples/_GetMultiple_test_1.toml new file mode 100644 index 00000000..6bbf8260 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_GetMultiple_test_1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "LIS_OMP" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarFieldLis/examples/_GetSingle_test_1.F90 b/docs/docs-api/ScalarFieldLis/examples/_GetSingle_test_1.F90 new file mode 100644 index 00000000..cbda1915 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_GetSingle_test_1.F90 @@ -0,0 +1,61 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-04 +! summary: GetSingle +! +! INTERFACE +! MODULE SUBROUTINE obj_GetSingle(obj, indx, VALUE) +! CLASS(AbstractNodeField_), INTENT(IN) :: obj +! INTEGER(I4B), INTENT(IN) :: indx +! REAL(DFP), INTENT(OUT) :: VALUE +! END SUBROUTINE obj_GetSingle +! END INTERFACE + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE GlobalData +USE ScalarField_Class +USE ScalarFieldLis_Class +USE FieldFactory, ONLY: ScalarFieldFactory +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE FEDOF_Class +USE Display_Method +USE BaseType, ONLY: math => TypeMathOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE Test_Method +USE ApproxUtility + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./_GetSingle_test_1.toml", & + myName = "main", & + modName = "_GetSingle_test_1.F90", & + engine = "LIS_OMP" +TYPE(FEDomain_) :: dom +TYPE(FEDOF_) :: fedof, geofedof +CLASS(ScalarField_), POINTER :: u + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain") + +u => ScalarFieldFactory(engine) +CALL u%ImportFromToml( & + fedof=fedof, geofedof=geofedof, dom=dom, fileName=tomlFileName, & + tomlName="u") + +CALL test1 + +CONTAINS + +SUBROUTINE test1 + REAL(DFP) :: found, want + LOGICAL(LGT) :: isok + + want = math%two + CALL u%SetSingle(indx=1, VALUE=want) + CALL u%GetSingle(indx=1, VALUE=found) + isok = want.approxeq.found + CALL OK(isok, myName) +END SUBROUTINE test1 + +END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_GetSingle_test_1.toml b/docs/docs-api/ScalarFieldLis/examples/_GetSingle_test_1.toml new file mode 100644 index 00000000..6bbf8260 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_GetSingle_test_1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "LIS_OMP" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarFieldLis/examples/_Import_test_1.md b/docs/docs-api/ScalarFieldLis/examples/_Import_test_1.md new file mode 100644 index 00000000..4ff75305 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_Import_test_1.md @@ -0,0 +1,84 @@ +In this example we initiate an instance of Scalar field by importing data from HDF5 file. + +```fortran +PROGRAM main + USE easifemBase + USE easifemClasses + TYPE( Domain_ ) :: dom + TYPE( ScalarFieldLis_ ) :: obj + TYPE( HDF5File_ ) :: meshfile, resultFile + TYPE( ParameterList_ ) :: param + INTEGER( I4B ) :: ierr + CHARACTER(*), PARAMETER :: engine = "LIS_OMP" +``` + +```fortran title="Open file for import" +CALL FPL_INIT() +CALL param%initiate() +CALL resultFile%initiate( filename="./result.h5", mode="READ" ) +CALL resultFile%open() +``` + +```fortran title="read domain" +!> start creating domain +CALL meshfile%initiate( filename="./mesh.h5", mode="READ" ) +CALL meshfile%open() +CALL dom%initiate( hdf5=meshfile, group="" ) +!> end creating domain +``` + +```fortran title="import" +!> start import +CALL obj%import( hdf5=resultFile, group="/scalarField1", dom=dom ) +!> end start import +``` + +```fortran +CALL obj%Display("obj = ") +``` + +```txt title="results" +#obj = +# isInitiated : TRUE +# name :U +# fieldType : NORMAL +# engine :LIS_OMP +# comm: 0 +# myRank: 0 +# numProcs: 1 +# global_n: 102 +# local_n: 102 +# is: 1 +# ie: 103 +# lis_ptr: 94830942589360 +# domain : ASSOCIATED +# domains : NOT ALLOCATED +# tSize : 102 +# # DOF data : +# Total Physical Variables :1 +# Name : U +# Space Components : 1 +# Time Components : 1 +# Total Nodes : 102 +# Storage Format : Nodes +# Value Map : +-------------- + 1 + 103 +# VAR :U + DOF-1 , +-------, +0.00000, +0.00000, +0.00000, +0.00000, +0.00000, +``` + +```fortran title="Cleanup" + CALL obj%Deallocate(); CALL dom%Deallocate() + CALL meshfile%Deallocate() + CALL resultFile%Deallocate() + CALL param%Deallocate(); CALL FPL_FINALIZE() +END PROGRAM main +``` diff --git a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_1.F90 b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_1.F90 index 763795d1..6ae3e287 100644 --- a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_1.F90 +++ b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_1.F90 @@ -1,64 +1,37 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-06-14 +! summary: Testing import from toml +! In this example we will initiate the fedof outside the ScalarField + PROGRAM main -USE GlobalData -USE AbstractField_Class, ONLY: TypeField -USE AbstractMesh_Class +USE AbstractField_Class USE FEDomain_Class -USE ScalarField_Class, ONLY: SetScalarFieldParam +USE GlobalData +USE ScalarField_Class USE ScalarFieldLis_Class +USE FieldFactory, ONLY: ScalarFieldFactory +USE EngineOpt_Class, ONLY: TypeEngineOpt USE FEDOF_Class -USE HDF5File_Class -USE FPL, ONLY: FPL_INIT, FPL_FINALIZE, ParameterList_ -USE Test_Method +USE Display_Method USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION IMPLICIT NONE +CHARACTER(*), PARAMETER :: tomlFileName = "./_Initiate_test_1.toml", & + myName = "main", & + modName = "_Initiate_test_1.F90", & + engine = "LIS_OMP" TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(FEDOF_) :: fedof -TYPE(ScalarFieldLis_) :: obj -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -INTEGER(I4B) :: ierr -CHARACTER(*), PARAMETER :: engine = "LIS_OMP" -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -CHARACTER(*), PARAMETER :: baseContinuity = "H1" -CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" -INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B), PARAMETER :: order = 1 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_INIT() -CALL param%Initiate() -CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") - -mesh => dom%GetMeshPointer(dim=nsd) - -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) - -CALL obj%Initiate(param=param, fedof=fedof) - -CALL OK(.TRUE., "Initiate:") +TYPE(FEDOF_) :: fedof, geofedof +CLASS(ScalarField_), POINTER :: u -CALL obj%Display("obj = ") +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain") -NULLIFY (mesh) -CALL obj%DEALLOCATE() -CALL dom%DEALLOCATE() -CALL fedof%DEALLOCATE() -CALL meshfile%DEALLOCATE() +u => ScalarFieldFactory(engine) +CALL u%ImportFromToml( & + fedof=fedof, geofedof=geofedof, dom=dom, fileName=tomlFileName, & + tomlName="u") -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() +CALL u%Display(myName//" u: ") END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_1.toml b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_1.toml new file mode 100644 index 00000000..6bbf8260 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "LIS_OMP" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_2.F90 b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_2.F90 deleted file mode 100644 index 88ec1bd2..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_2.F90 +++ /dev/null @@ -1,67 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-05-24 -! summary: We test ScalarField with heirarchical basis intrpolation - -PROGRAM main -USE GlobalData -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE AbstractMesh_Class -USE FEDomain_Class -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FEDOF_Class -USE HDF5File_Class -USE FPL, ONLY: FPL_INIT, FPL_FINALIZE, ParameterList_ -USE Test_Method -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION - -IMPLICIT NONE - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(FEDOF_) :: fedof -TYPE(ScalarFieldLis_) :: obj -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -INTEGER(I4B) :: ierr -CHARACTER(*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename="../../Mesh/examples/meshdata/small_mesh.h5" -CHARACTER(*), PARAMETER :: baseContinuity = "H1" -CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" -INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B), PARAMETER :: order = 1 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_INIT() -CALL param%initiate() -CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - -CALL meshfile%initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%initiate(hdf5=meshfile, group="") - -mesh => dom%GetMeshPointer(dim=nsd) - -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) - -CALL obj%Initiate(param=param, fedof=fedof) - -CALL OK(.TRUE., "Initiate:") - -CALL obj%Display("obj = ") - -NULLIFY (mesh) -CALL obj%DEALLOCATE() -CALL dom%DEALLOCATE() -CALL fedof%DEALLOCATE() -CALL meshfile%DEALLOCATE() - -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_3.F90 b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_3.F90 deleted file mode 100644 index 09456700..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_3.F90 +++ /dev/null @@ -1,68 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-05-24 -! summary: We test ScalarField with heirarchical basis intrpolation - -PROGRAM main -USE GlobalData -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE AbstractMesh_Class -USE FEDomain_Class -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class - -USE FEDOF_Class -USE HDF5File_Class -USE FPL, ONLY: FPL_INIT, FPL_FINALIZE, ParameterList_ -USE Test_Method -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION - -IMPLICIT NONE - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(FEDOF_) :: fedof -TYPE(ScalarFieldLis_) :: obj -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -INTEGER(I4B) :: ierr -CHARACTER(*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename="../../Mesh/examples/meshdata/small_mesh.h5" -CHARACTER(*), PARAMETER :: baseContinuity = "H1" -CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" -INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B), PARAMETER :: order = 3 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_INIT() -CALL param%initiate() -CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - -CALL meshfile%initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%initiate(hdf5=meshfile, group="") - -mesh => dom%GetMeshPointer(dim=nsd) - -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) - -CALL obj%Initiate(param=param, fedof=fedof) - -CALL OK(.TRUE., "Initiate:") - -CALL obj%Display("obj = ") - -NULLIFY (mesh) -CALL obj%DEALLOCATE() -CALL dom%DEALLOCATE() -CALL fedof%DEALLOCATE() -CALL meshfile%DEALLOCATE() - -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_4.F90 b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_4.F90 deleted file mode 100644 index 00144f31..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_4.F90 +++ /dev/null @@ -1,67 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-05-24 -! summary: We test ScalarField with heirarchical basis intrpolation - -PROGRAM main -USE GlobalData -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE AbstractMesh_Class -USE FEDomain_Class -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FEDOF_Class -USE HDF5File_Class -USE FPL, ONLY: FPL_INIT, FPL_FINALIZE, ParameterList_ -USE Test_Method -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION - -IMPLICIT NONE - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(FEDOF_) :: fedof -TYPE(ScalarFieldLis_) :: obj -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -INTEGER(I4B) :: ierr -CHARACTER(*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename="../../Mesh/examples/meshdata/small_mesh.h5" -CHARACTER(*), PARAMETER :: baseContinuity = "H1" -CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" -INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B), PARAMETER :: order = 4 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_INIT() -CALL param%initiate() -CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - -CALL meshfile%initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%initiate(hdf5=meshfile, group="") - -mesh => dom%GetMeshPointer(dim=nsd) - -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=order, mesh=mesh) - -CALL obj%Initiate(param=param, fedof=fedof) - -CALL OK(.TRUE., "Initiate:") - -CALL obj%Display("obj = ") - -NULLIFY (mesh) -CALL obj%DEALLOCATE() -CALL dom%DEALLOCATE() -CALL fedof%DEALLOCATE() -CALL meshfile%DEALLOCATE() - -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_5.F90 b/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_5.F90 deleted file mode 100644 index 57863fe6..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Initiate_test_5.F90 +++ /dev/null @@ -1,90 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-05-24 -! summary: We test ScalarField with heirarchical basis intrpolation - -PROGRAM main -USE GlobalData -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE AbstractMesh_Class -USE FEDomain_Class -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class - -USE FEDOF_Class -USE HDF5File_Class -USE FPL, ONLY: FPL_INIT, FPL_FINALIZE, ParameterList_ -USE Test_Method -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ReallocateUtility, ONLY: Reallocate - -IMPLICIT NONE - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(FEDOF_) :: fedof -TYPE(ScalarFieldLis_) :: obj -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -INTEGER(I4B) :: ierr -CHARACTER(*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -CHARACTER(*), PARAMETER :: baseContinuity = "H1" -CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" -INTEGER(I4B), PARAMETER :: nsd = 2 -INTEGER(I4B), ALLOCATABLE :: cellOrder(:, :), aintvec(:) -INTEGER(I4B) :: order - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_INIT() -CALL param%initiate() -CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - -CALL meshfile%initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%initiate(hdf5=meshfile, group="") - -mesh => dom%GetMeshPointer(dim=nsd) - -CALL Reallocate(cellOrder, 2, mesh%GetTotalCells()) - -aintvec = [14, 15, 17, 24, 18] - -order = 1 -cellOrder(1, 1:5) = aintvec -cellOrder(2, 1:5) = order - -aintvec = [22, 23, 25, 21] -order = 2 -cellOrder(1, 6:9) = aintvec -cellOrder(2, 6:9) = order - -aintvec = [19, 20, 26, 16, 13] -order = 3 -cellOrder(1, 10:14) = aintvec -cellOrder(2, 10:14) = order - -CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, & - order=cellOrder, & - mesh=mesh) - -CALL obj%Initiate(param=param, fedof=fedof) - -CALL obj%Display("obj = ") - -CALL OK(.TRUE., "Initiate:") - -NULLIFY (mesh) -CALL obj%DEALLOCATE() -CALL dom%DEALLOCATE() -CALL fedof%DEALLOCATE() -CALL meshfile%DEALLOCATE() - -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_SetAll_test_1.F90 b/docs/docs-api/ScalarFieldLis/examples/_SetAll_test_1.F90 new file mode 100644 index 00000000..92e89c9e --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_SetAll_test_1.F90 @@ -0,0 +1,54 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-04 +! summary: SetAll +! +! INTERFACE +! MODULE SUBROUTINE obj_SetAll(obj, VALUE, scale, addContribution) +! CLASS(ScalarFieldLis_), INTENT(INOUT) :: obj +! REAL(DFP), INTENT(IN) :: VALUE +! !! value to be set or add +! REAL(DFP), OPTIONAL, INTENT(IN) :: scale +! !! scale +! LOGICAL(LGT), OPTIONAL, INTENT(IN) :: addContribution +! !! add or set +! END SUBROUTINE obj_SetAll +! END INTERFACE + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE GlobalData +USE ScalarField_Class +USE ScalarFieldLis_Class +USE FieldFactory, ONLY: ScalarFieldFactory +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE FEDOF_Class +USE Display_Method +USE BaseType, ONLY: math => TypeMathOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./_SetAll_test_1.toml", & + myName = "main", & + modName = "_Initiate_test_1.F90", & + engine = "LIS_OMP" +TYPE(FEDomain_) :: dom +TYPE(FEDOF_) :: fedof, geofedof +CLASS(ScalarField_), POINTER :: u + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain") + +u => ScalarFieldFactory(engine) +CALL u%ImportFromToml( & + fedof=fedof, geofedof=geofedof, dom=dom, fileName=tomlFileName, & + tomlName="u") + +! MODULE SUBROUTINE obj_SetSingle(obj, indx, VALUE, scale, addContribution) +CALL u%SetAll( & + VALUE=math%one, scale=math%two, addContribution=math%yes) + +CALL u%Display(myName//" u: ") + +END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_SetAll_test_1.toml b/docs/docs-api/ScalarFieldLis/examples/_SetAll_test_1.toml new file mode 100644 index 00000000..6bbf8260 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_SetAll_test_1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "LIS_OMP" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarFieldLis/examples/_SetMultiple_test_1.F90 b/docs/docs-api/ScalarFieldLis/examples/_SetMultiple_test_1.F90 new file mode 100644 index 00000000..de4020f2 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_SetMultiple_test_1.F90 @@ -0,0 +1,167 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-04 +! summary: SetAll +! +! INTERFACE +! MODULE SUBROUTINE obj_SetMultiple1( & +! obj, indx, VALUE, scale, addContribution) +! CLASS(ScalarFieldLis_), INTENT(INOUT) :: obj +! INTEGER(I4B), INTENT(IN) :: indx(:) +! !! index, size(indx) = size(value) = tsize +! REAL(DFP), INTENT(IN) :: VALUE(:) +! !! values which will be use din obj=value +! REAL(DFP), OPTIONAL, INTENT(IN) :: scale +! !! scale +! LOGICAL(LGT), OPTIONAL, INTENT(IN) :: addContribution +! !! add or set +! END SUBROUTINE obj_SetMultiple1 +! END INTERFACE +! +! INTERFACE +! MODULE SUBROUTINE obj_SetMultiple2( & +! obj, istart, iend, stride, VALUE, scale, addContribution) +! CLASS(ScalarFieldLis_), INTENT(INOUT) :: obj +! INTEGER(I4B), INTENT(IN) :: istart, iend, stride +! !! index, size(indx) = size(value) = tsize +! REAL(DFP), INTENT(IN) :: VALUE(:) +! !! obj = value +! REAL(DFP), OPTIONAL, INTENT(IN) :: scale +! !! scale +! LOGICAL(LGT), OPTIONAL, INTENT(IN) :: addContribution +! !! add or set +! END SUBROUTINE obj_SetMultiple2 +! END INTERFACE +! +! INTERFACE +! MODULE SUBROUTINE obj_SetMultiple3( & +! obj, istart, iend, stride, VALUE, istart_value, iend_value, & +! stride_value, scale, addContribution) +! CLASS(ScalarFieldLis_), INTENT(INOUT) :: obj +! INTEGER(I4B), INTENT(IN) :: istart, iend, stride +! !! index, size(indx) = size(value) = tsize +! REAL(DFP), INTENT(IN) :: VALUE(:) +! !! returned vlaue +! INTEGER(I4B), INTENT(IN) :: istart_value, iend_value, stride_value +! !! range of values +! REAL(DFP), OPTIONAL, INTENT(IN) :: scale +! !! scale +! LOGICAL(LGT), OPTIONAL, INTENT(IN) :: addContribution +! !! add or set +! END SUBROUTINE obj_SetMultiple3 +! END INTERFACE +! +! INTERFACE +! MODULE SUBROUTINE obj_SetMultiple4( & +! obj, istart, iend, stride, VALUE, scale, addContribution) +! CLASS(ScalarFieldLis_), INTENT(INOUT) :: obj +! INTEGER(I4B), INTENT(IN) :: istart, iend, stride +! !! index, size(indx) = size(value) = tsize +! REAL(DFP), INTENT(IN) :: VALUE +! !! obj = value +! REAL(DFP), OPTIONAL, INTENT(IN) :: scale +! !! scale +! LOGICAL(LGT), OPTIONAL, INTENT(IN) :: addContribution +! !! add or set +! END SUBROUTINE obj_SetMultiple4 +! END INTERFACE + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE GlobalData +USE ScalarField_Class +USE ScalarFieldLis_Class +USE FieldFactory, ONLY: ScalarFieldFactory +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE FEDOF_Class +USE Display_Method +USE BaseType, ONLY: math => TypeMathOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION +USE GridPointUtility, ONLY: Linspace + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./_SetMultiple_test_1.toml", & + myName = "main", & + modName = "_Initiate_test_1.F90", & + engine = "LIS_OMP" +TYPE(FEDomain_) :: dom +TYPE(FEDOF_) :: fedof, geofedof +CLASS(ScalarField_), POINTER :: u + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain") + +u => ScalarFieldFactory(engine) +CALL u%ImportFromToml( & + fedof=fedof, geofedof=geofedof, dom=dom, fileName=tomlFileName, & + tomlName="u") + +CALL test1 +CALL test2 +CALL test3 +CALL test4 + +CONTAINS + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test1 + INTEGER(I4B), ALLOCATABLE :: indx(:) + REAL(DFP), ALLOCATABLE :: VALUE(:) + indx = [1, 3, 5, 7] + VALUE = [10.0, 30.0, 50.0, 70.0] + CALL u%SetMultiple(indx=indx, VALUE=VALUE) + CALL u%Display("test 1") +END SUBROUTINE test1 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test2 + INTEGER(I4B) :: istart, iend, stride + REAL(DFP), ALLOCATABLE :: VALUE(:) + istart = 1 + iend = 7 + stride = 2 + VALUE = [10.0, 30.0, 50.0, 70.0] + CALL u%SetMultiple(istart=istart, iend=iend, stride=stride, VALUE=VALUE) + CALL u%Display("test 2") +END SUBROUTINE test2 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test3 + INTEGER(I4B) :: istart, iend, stride + REAL(DFP), ALLOCATABLE :: VALUE(:) + istart = 1 + iend = 7 + stride = 2 + VALUE = Linspace(1.0_DFP, 10.0_DFP, 10) + CALL u%SetMultiple( & + istart=istart, iend=iend, stride=stride, VALUE=VALUE, istart_value=1, & + iend_value=7, stride_value=2) + CALL u%Display("test 3") +END SUBROUTINE test3 + +!---------------------------------------------------------------------------- +! +!---------------------------------------------------------------------------- + +SUBROUTINE test4 + INTEGER(I4B) :: istart, iend, stride + REAL(DFP) :: VALUE + istart = 1 + iend = 7 + stride = 2 + VALUE = 10.0 + CALL u%SetMultiple(istart=istart, iend=iend, stride=stride, VALUE=VALUE) + CALL u%Display("test 4") +END SUBROUTINE test4 + +END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_SetMultiple_test_1.toml b/docs/docs-api/ScalarFieldLis/examples/_SetMultiple_test_1.toml new file mode 100644 index 00000000..6bbf8260 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_SetMultiple_test_1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "LIS_OMP" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarFieldLis/examples/_SetSingle_test_1.F90 b/docs/docs-api/ScalarFieldLis/examples/_SetSingle_test_1.F90 new file mode 100644 index 00000000..0b56987c --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_SetSingle_test_1.F90 @@ -0,0 +1,52 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-12-04 +! summary: SetSingle +! +! INTERFACE +! MODULE SUBROUTINE obj_SetSingle(obj, indx, VALUE, scale, addContribution) +! CLASS(ScalarFieldLis_), INTENT(INOUT) :: obj +! INTEGER(I4B), INTENT(IN) :: indx +! REAL(DFP), INTENT(IN) :: VALUE +! REAL(DFP), OPTIONAL, INTENT(IN) :: scale +! LOGICAL(LGT), OPTIONAL, INTENT(IN) :: addContribution +! END SUBROUTINE obj_SetSingle +! END INTERFACE + +PROGRAM main +USE AbstractField_Class +USE FEDomain_Class +USE GlobalData +USE ScalarField_Class +USE ScalarFieldLis_Class +USE FieldFactory, ONLY: ScalarFieldFactory +USE EngineOpt_Class, ONLY: TypeEngineOpt +USE FEDOF_Class +USE Display_Method +USE BaseType, ONLY: math => TypeMathOpt +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +CHARACTER(*), PARAMETER :: tomlFileName = "./_SetSingle_test_1.toml", & + myName = "main", & + modName = "_Initiate_test_1.F90", & + engine = "LIS_OMP" +TYPE(FEDomain_) :: dom +TYPE(FEDOF_) :: fedof, geofedof +CLASS(ScalarField_), POINTER :: u + +CALL e%SetQuietMode(EXCEPTION_INFORMATION, .TRUE.) +CALL dom%ImportFromToml(fileName=tomlFileName, tomlName="domain") + +u => ScalarFieldFactory(engine) +CALL u%ImportFromToml( & + fedof=fedof, geofedof=geofedof, dom=dom, fileName=tomlFileName, & + tomlName="u") + +! MODULE SUBROUTINE obj_SetSingle(obj, indx, VALUE, scale, addContribution) +CALL u%SetSingle( & + indx=1, VALUE=math%one, scale=math%two, addContribution=math%yes) + +CALL u%Display(myName//" u: ") + +END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_SetSingle_test_1.toml b/docs/docs-api/ScalarFieldLis/examples/_SetSingle_test_1.toml new file mode 100644 index 00000000..6bbf8260 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/_SetSingle_test_1.toml @@ -0,0 +1,32 @@ +[domain] +filename = "./mesh/square_3x3.h5" +totalMedium = 1 + +[u] +name = "u" +engine = "LIS_OMP" +fieldType = "Normal" +spaceCompo = 1 +timeCompo = 1 +fedofName = "space" +geofedofName = "geofedof" + +[u.geofedof] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" + +[u.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +baseType = "Monomial" +order = 1 +scaleForQuadOrder = 2 +quadOptName = "quadOpt" + +[u.space.quadOpt] +isHomogeneous = true +quadratureType = "GaussLegendre" +# order = 2 diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_1.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_1.F90 deleted file mode 100644 index babc0365..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_1.F90 +++ /dev/null @@ -1,118 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set1 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility -USE Display_Method - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -REAL(DFP), ALLOCATABLE :: realVec(:) -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 -CHARACTER(:), ALLOCATABLE :: msg -INTEGER(I4B) :: localNode -REAL(DFP) :: VALUE, tol -LOGICAL(LGT) :: isok - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set1 " - localNode = 1 - CALL obj%Set(globalnode=localNode, VALUE=100.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(100.0_DFP, VALUE, tol) - CALL OK(isok, msg) - IF (.NOT. isok) THEN - CALL Display(msg="found = ", val=VALUE) - END IF - - localNode = 2 - CALL obj%Set(globalnode=localNode, VALUE=200.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(200.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set1 " - localNode = 3 - CALL obj%Set(globalnode=localNode, VALUE=100.0_DFP, islocal=.TRUE.) - CALL obj%Get(globalnode=localNode, VALUE=VALUE, islocal=.TRUE.) - tol = 1.0E-5 - isok = SOFTEQ(100.0_DFP, VALUE, tol) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_2.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_2.F90 deleted file mode 100644 index abd82fe6..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_2.F90 +++ /dev/null @@ -1,151 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set2 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility -USE Display_Method, ONLY: Display - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set2 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - IF (.NOT. isok) THEN - CALL Display(msg="found=", val=found(1:tsize)) - CALL Display(msg="want=", val=want(1:tsize)) - END IF - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set2 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - IF (.NOT. isok) THEN - CALL Display(msg="found=", val=found(1:tsize)) - CALL Display(msg="want=", val=want(1:tsize)) - END IF - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_3.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_3.F90 deleted file mode 100644 index 7fc573b1..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_3.F90 +++ /dev/null @@ -1,144 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set3 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility -USE ArangeUtility - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set3 " - tsize = obj%SIZE() - VALUE(1:tsize) = arange(1, tsize) - CALL obj%Set(VALUE=VALUE(1:tsize)) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE(1:tsize) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE(1:tsize), scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE(1:tsize) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE(1:tsize), addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - msg = "Set3 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - - want(1:tsize) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 3.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want(1:tsize) = 4.0_DFP * VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_4.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_4.F90 deleted file mode 100644 index 45ff4b39..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_4.F90 +++ /dev/null @@ -1,120 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set4 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set4 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE, globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE, tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set4 " - VALUE = 100.0_DFP - CALL obj%Set(VALUE=VALUE, globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_5.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_5.F90 deleted file mode 100644 index c7ebf455..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_5.F90 +++ /dev/null @@ -1,141 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set5 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set5 " - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE., scale=2.0_DFP) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 3 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE.) - - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 4 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set5 " - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_6.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_6.F90 deleted file mode 100644 index 699e1169..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_6.F90 +++ /dev/null @@ -1,141 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set5 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set6 " - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE., scale=2.0_DFP) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 3 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE., & - addContribution=.TRUE.) - - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 4 * VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 2 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Heirarchical" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - REAL(DFP) :: found(100), want(100), VALUE(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set6 " - VALUE(1:3) = [10, 20, 30] - CALL obj%Set(VALUE=VALUE(1:3), globalNode=localNode, islocal=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - - want = 0.0_DFP - want(localNode) = VALUE(1:3) - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_7.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_7.F90 deleted file mode 100644 index 04a1732f..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_7.F90 +++ /dev/null @@ -1,163 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set7 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam, ScalarField_ -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility -USE Display_Method - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj, VALUE - REAL(DFP) :: found(100), want(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - CALL VALUE%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set7 " - - DO ii = 1, SIZE(localNode) - CALL VALUE%Set(VALUE=REAL(localNode(ii), kind=DFP), & - globalNode=localNode(ii), islocal=.TRUE.) - END DO - - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - IF (.NOT. isok) THEN - CALL Display(msg="found", val=found(1:tsize)) - CALL Display(msg="want", val=want(1:tsize)) - END IF - - CALL obj%Set(0.0_DFP) - obj = VALUE - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj - TYPE(ScalarField_) :: VALUE - REAL(DFP) :: found(100), want(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=TypeEngineName%native_serial) - CALL VALUE%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set7 " - - DO ii = 1, SIZE(localNode) - CALL VALUE%Set(VALUE=REAL(localNode(ii), kind=DFP), & - globalNode=localNode(ii), islocal=.TRUE.) - END DO - - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - IF (.NOT. isok) THEN - CALL Display(msg="found", val=found(1:tsize)) - CALL Display(msg="want", val=want(1:tsize)) - END IF - - CALL obj%Set(0.0_DFP) - obj = VALUE - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/_Set_test_8.F90 b/docs/docs-api/ScalarFieldLis/examples/_Set_test_8.F90 deleted file mode 100644 index 49c561cb..00000000 --- a/docs/docs-api/ScalarFieldLis/examples/_Set_test_8.F90 +++ /dev/null @@ -1,96 +0,0 @@ -!> author: Vikas Sharma, Ph. D. -! date: 2024-06-05 -! summary: Set8 - -PROGRAM main -USE FEDomain_Class -USE HDF5File_Class -USE AbstractMesh_Class -USE AbstractField_Class, ONLY: TypeField, TypeEngineName -USE ScalarField_Class, ONLY: SetScalarFieldParam -USE ScalarFieldLis_Class -USE FPL, ONLY: FPL_Init, FPL_FINALIZE, ParameterList_ -USE GlobalData -USE Test_Method -USE FEDOF_Class -USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION -USE ApproxUtility - -TYPE(FEDomain_) :: dom -CLASS(AbstractMesh_), POINTER :: mesh -TYPE(HDF5File_) :: meshfile -TYPE(ParameterList_) :: param -CHARACTER(LEN=*), PARAMETER :: engine = TypeEngineName%lis_omp -CHARACTER(*), PARAMETER :: meshfilename = & - "../../Mesh/examples/meshdata/small_mesh.h5" -INTEGER(I4B), PARAMETER :: nsd = 2 - -CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) - -CALL FPL_Init() -CALL param%Initiate() - -!> start creating domain -CALL meshfile%Initiate(filename=meshfilename, mode="READ") -CALL meshfile%OPEN() -CALL dom%Initiate(hdf5=meshfile, group="") -!> end creating domain - -mesh => dom%GetMeshPointer(dim=nsd) - -BLOCK - INTEGER(I4B), PARAMETER :: order = 1 - CHARACTER(*), PARAMETER :: baseContinuity = "H1" - CHARACTER(*), PARAMETER :: baseInterpolation = "Lagrange" - TYPE(FEDOF_) :: fedof - TYPE(ScalarFieldLis_) :: obj, VALUE - REAL(DFP) :: found(100), want(100), tol - INTEGER(I4B) :: tsize, localNode(3) - CHARACTER(:), ALLOCATABLE :: msg - LOGICAL(LGT) :: isok - - CALL fedof%Initiate(baseContinuity=baseContinuity, & - baseInterpolation=baseInterpolation, order=order, mesh=mesh) - - CALL SetScalarFieldParam(param=param, & - fieldType=TypeField%normal, & - name="U", & - engine=engine) - - CALL obj%Initiate(param, fedof) - CALL VALUE%Initiate(param, fedof) - - localNode = [1, 3, 5] - - msg = "Set8 " - - DO ii = 1, SIZE(localNode) - CALL VALUE%Set(VALUE=REAL(localNode(ii), kind=DFP), & - globalNode=localNode(ii), islocal=.TRUE.) - END DO - - CALL obj%Set(VALUE=VALUE) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%Set(VALUE=VALUE, scale=2.0_DFP, addContribution=.TRUE.) - CALL obj%Get(VALUE=found, tsize=tsize) - want = 0.0_DFP - want(localNode) = 3 * localNode - tol = 1.0E-5 - isok = ALL(SOFTEQ(found(1:tsize), want(1:tsize), tol)) - CALL OK(isok, msg) - - CALL obj%DEALLOCATE() -END BLOCK - -mesh => NULL() -CALL dom%DEALLOCATE() -CALL meshfile%DEALLOCATE() -CALL param%DEALLOCATE() -CALL FPL_FINALIZE() -END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/mesh/main.F90 b/docs/docs-api/ScalarFieldLis/examples/mesh/main.F90 new file mode 100644 index 00000000..cf0cd946 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/mesh/main.F90 @@ -0,0 +1,84 @@ +PROGRAM main +USE Gmsh_Class +USE GlobalData +USE MSHFile_Class +USE HDF5File_Class +USE Display_Method + +TYPE(Gmsh_) :: gmsh + +CHARACTER(LEN=*), PARAMETER :: prefix = "square" +REAL(DFP), PARAMETER :: lx = 1.0_DFP +REAL(DFP), PARAMETER :: ly = 1.0_DFP +INTEGER(I4B), PARAMETER :: order = 1 + +REAL(DFP), PARAMETER :: meshSize = 1.0 +REAL(DFP), PARAMETER :: corner(3) = 0.0_DFP +INTEGER(I4B), PARAMETER :: nnod(2) = [3, 3] +INTEGER(I4B) :: ierr +REAL(DFP) :: x, y, z, lc +CHARACTER(:), ALLOCATABLE :: suffix, title + +TYPE(MSHFile_) :: mshFile +TYPE(HDF5File_) :: hdf5file + +suffix = ToString(nnod(1))//"x"//ToString(nnod(2)) + +title = prefix//"_"//suffix + +ierr = gmsh%Initialize() +ierr = gmsh%model%add(title) + +x = corner(1); y = corner(2); z = corner(3); lc = meshSize +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=1) + +x = x + lx; y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=2) + +x = x; y = y + ly; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=3) + +x = corner(1); y = y; z = z; lc = lc +ierr = gmsh%model%geo%addPoint(x=x, y=y, z=z, meshSize=lc, tag=4) + +ierr = gmsh%model%geo%addLine(1, 2, 1) +ierr = gmsh%model%geo%addLine(2, 3, 2) +ierr = gmsh%model%geo%addLine(3, 4, 3) +ierr = gmsh%model%geo%addLine(4, 1, 4) + +ierr = gmsh%model%geo%addCurveLoop([1, 2, 3, 4], tag=1) + +ierr = gmsh%model%geo%addPlaneSurface([1], 1) + +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(1, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(3, nnod(1), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(2, nnod(2), & + "Progression", 1.0_DFP) +ierr = gmsh%model%geo%mesh%setTransfiniteCurve(4, nnod(2), & + "Progression", 1.0_DFP) + +ierr = gmsh%model%geo%mesh%setTransfiniteSurface(1) +ierr = gmsh%model%geo%mesh%setRecombine(2, 1) + +ierr = gmsh%model%geo%synchronize() + +ierr = gmsh%model%mesh%generate(2) + +ierr = gmsh%model%mesh%setOrder(order) + +ierr = gmsh%WRITE(title//'.msh') + +ierr = gmsh%Finalize() + +CALL mshFile%Initiate(filename=title//'.msh', STATUS="OLD", ACTION="READ") +CALL mshFile%OPEN() +CALL mshFile%READ() +CALL hdf5file%Initiate(title//'.h5', MODE="NEW") +CALL hdf5file%OPEN() +CALL mshFile%Export(hdf5=hdf5file, group="") +CALL mshFile%DEALLOCATE() +CALL hdf5file%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/ScalarFieldLis/examples/mesh/runner.toml b/docs/docs-api/ScalarFieldLis/examples/mesh/runner.toml new file mode 100644 index 00000000..3d324f66 --- /dev/null +++ b/docs/docs-api/ScalarFieldLis/examples/mesh/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/MeshField/mesh/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/ScalarFieldLis/examples/runner.toml b/docs/docs-api/ScalarFieldLis/examples/runner.toml index d6eac817..3d1b323b 100644 --- a/docs/docs-api/ScalarFieldLis/examples/runner.toml +++ b/docs/docs-api/ScalarFieldLis/examples/runner.toml @@ -1,3 +1,3 @@ BuildType = "Debug" -# BuildDir = "/tmp/easifem-test/" +BuildDir = "/tmp/easifem-test/ScalarFieldLis/" TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/SolidMaterial/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/SolidMaterial/examples/_ImportFromToml_test_1.F90 index 2c925ca3..e507b6c7 100644 --- a/docs/docs-api/SolidMaterial/examples/_ImportFromToml_test_1.F90 +++ b/docs/docs-api/SolidMaterial/examples/_ImportFromToml_test_1.F90 @@ -1,20 +1,15 @@ ! Initiate an instance of `SolidMaterial_`. PROGRAM main -USE easifemBase -USE easifemClasses -USE easifemMaterials +USE SolidMaterial_Class +USE GlobalData +IMPLICIT NONE -CHARACTER(*), PARAMETER :: tomlFileName = "./SolidMaterial.toml" +CHARACTER(*), PARAMETER :: tomlFileName = "./toml/SolidMaterial1.toml" CHARACTER(*), PARAMETER :: tomlName = "solid" TYPE(SolidMaterial_) :: obj -INTEGER(I4B) :: ierr - -CALL FPL_Init CALL obj%ImportFromToml(tomlName="solid", filename=tomlFileName) CALL obj%Display("obj:") -CALL FPL_FINALIZE - END PROGRAM main diff --git a/docs/docs-api/SolidMaterial/examples/runner.toml b/docs/docs-api/SolidMaterial/examples/runner.toml new file mode 100644 index 00000000..8496ddf8 --- /dev/null +++ b/docs/docs-api/SolidMaterial/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/SolidMaterial/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/SolidMaterial/examples/SolidMaterial.toml b/docs/docs-api/SolidMaterial/examples/toml/SolidMaterial1.toml similarity index 74% rename from docs/docs-api/SolidMaterial/examples/SolidMaterial.toml rename to docs/docs-api/SolidMaterial/examples/toml/SolidMaterial1.toml index 5325736c..736f105a 100644 --- a/docs/docs-api/SolidMaterial/examples/SolidMaterial.toml +++ b/docs/docs-api/SolidMaterial/examples/toml/SolidMaterial1.toml @@ -1,5 +1,7 @@ [solid] +name = "solid" stressStrainModel = "linearElasticModel" +propNames = ["massDensity", "poissonRatio", "youngsModulus"] [solid.linearElasticModel] name = "linearElasticModel" @@ -7,19 +9,19 @@ elasticityType = "ISO" poissonRatio = 0.1 youngsModulus = 1.0 -[[solid.property]] +[solid.massDensity] name = "massDensity" returnType = "Scalar" argType = "Constant" value = 1.0 -[[solid.property]] +[solid.poissonRatio] name = "poissonRatio" returnType = "Scalar" argType = "Constant" value = 2.0 -[[solid.property]] +[solid.youngsModulus] name = "youngsModulus" returnType = "Scalar" argType = "Constant" diff --git a/docs/docs-api/TomlUtility/GetValue.md b/docs/docs-api/TomlUtility/GetValue.md index 1e5810f0..2ec8244e 100644 --- a/docs/docs-api/TomlUtility/GetValue.md +++ b/docs/docs-api/TomlUtility/GetValue.md @@ -8,14 +8,14 @@ title: GetValue ```fortran INTERFACE GetValue MODULE SUBROUTINE GetValue(table, key, VALUE, default_value, & - origin, stat, isFound) + origin, stat, isFound) TYPE(toml_table), INTENT(INOUT) :: table !! Toml table CHARACTER(*), INTENT(IN) :: key !! key - {DATA_TYPE}, INTENT(INOUT) :: VALUE + DataType, INTENT(INOUT) :: VALUE !! value in string - {DATA_TYPE}, INTENT(IN) :: default_value + DataType, INTENT(IN) :: default_value !! default value INTEGER(I4B), OPTIONAL, INTENT(INOUT) :: origin !! origin, necessary for debugging @@ -27,7 +27,7 @@ INTERFACE GetValue END INTERFACE GetValue ``` -Following data types are supported. +Following DataTypes are supported. - String - INTEGER(Int8 | Int16 | Int32 | Int64) @@ -44,10 +44,10 @@ The generic interface for getting the vector values is as follows: ```fortran INTERFACE GetValue MODULE SUBROUTINE GetValue(table, key, VALUE, origin, stat, & - isFound) + isFound) TYPE(toml_table), INTENT(INOUT) :: table CHARACTER(*), INTENT(IN) :: key - DATA_TYPE, ALLOCATABLE, INTENT(INOUT) :: VALUE(:) + DataType, ALLOCATABLE, INTENT(INOUT) :: VALUE(:) INTEGER(I4B), OPTIONAL, INTENT(INOUT) :: origin INTEGER(I4B), OPTIONAL, INTENT(INOUT) :: stat LOGICAL(LGT), OPTIONAL, INTENT(INOUT) :: isFound @@ -60,10 +60,10 @@ The above method will allocate the value. If you want to avoid the allocation, t ```fortran INTERFACE GetValue_ MODULE SUBROUTINE GetValue_(table, key, VALUE, tsize, origin, stat, & - isFound) + isFound) TYPE(toml_table), INTENT(INOUT) :: table CHARACTER(*), INTENT(IN) :: key - DATA_TYPE, ALLOCATABLE, INTENT(INOUT) :: VALUE(:) + DataType, ALLOCATABLE, INTENT(INOUT) :: VALUE(:) INTEGER(I4B), INTENT(OUT) :: tsize INTEGER(I4B), OPTIONAL, INTENT(INOUT) :: origin INTEGER(I4B), OPTIONAL, INTENT(INOUT) :: stat @@ -86,10 +86,10 @@ The generic interface for getting the matrix values is as follows: ```fortran INTERFACE GetValue MODULE SUBROUTINE GetValue(table, key, VALUE, origin, stat, & - isFound) + isFound) TYPE(toml_table), INTENT(INOUT) :: table CHARACTER(*), INTENT(IN) :: key - DATA_TYPE, ALLOCATABLE, INTENT(INOUT) :: VALUE(:, :) + DataType, ALLOCATABLE, INTENT(INOUT) :: VALUE(:, :) INTEGER(I4B), OPTIONAL, INTENT(INOUT) :: origin INTEGER(I4B), OPTIONAL, INTENT(INOUT) :: stat LOGICAL(LGT), OPTIONAL, INTENT(INOUT) :: isFound @@ -102,7 +102,7 @@ The above method will allocate the value. If you want to avoid the allocation, t ```fortran INTERFACE GetValue_ MODULE SUBROUTINE GetValue_(table, key, VALUE, origin, stat, & - isFound, nrow, ncol) + isFound, nrow, ncol) TYPE(toml_table), INTENT(INOUT) :: table CHARACTER(*), INTENT(IN) :: key INTEGER(INT8), INTENT(INOUT) :: VALUE(:, :) diff --git a/docs/docs-api/VectorField/examples/_ImportFromToml_test_1.F90 b/docs/docs-api/VectorField/examples/_ImportFromToml_test_1.F90 new file mode 100644 index 00000000..fd7823f9 --- /dev/null +++ b/docs/docs-api/VectorField/examples/_ImportFromToml_test_1.F90 @@ -0,0 +1,54 @@ +!> author: Vikas Sharma, Ph. D. +! date: 2025-07-02 +! summary: Testing import from toml for vectorfield + +PROGRAM main +USE GlobalData +USE BaseType, ONLY: TypeQuadratureOpt +USE AbstractMesh_Class +USE FEDomain_Class +USE VectorField_Class +USE FEDOF_Class +USE HDF5File_Class +USE Test_Method +USE ExceptionHandler_Class, ONLY: e, EXCEPTION_INFORMATION + +IMPLICIT NONE + +! Parameters are defined here +CHARACTER(*), PARAMETER :: engine = "NATIVE_SERIAL" +CHARACTER(*), PARAMETER :: & + meshfilename = "../../FEMesh/examples/meshdata/small_tri3_mesh.h5" +CHARACTER(*), PARAMETER :: tomlfilename = "./toml/VectorField.toml" +INTEGER(I4B), PARAMETER :: nsd = 2 +INTEGER(I4B), PARAMETER :: order = 1 + +! Variables are defined here +TYPE(FEDomain_) :: dom +CLASS(AbstractMesh_), POINTER :: mesh +TYPE(FEDOF_) :: fedof +TYPE(VectorField_) :: obj +TYPE(HDF5File_) :: meshfile + +CALL e%setQuietMode(EXCEPTION_INFORMATION, .TRUE.) + +CALL meshfile%Initiate(filename=meshfilename, mode="READ") +CALL meshfile%OPEN() +CALL dom%Initiate(hdf5=meshfile, group="") +mesh => dom%GetMeshPointer(dim=nsd) + +CALL obj%ImportFromToml(tomlName="field1", & + filename=tomlfilename, & + fedof=fedof, & + mesh=mesh & + ) + +CALL obj%Display("ScalarField obj:") + +NULLIFY (mesh) +CALL obj%DEALLOCATE() +CALL dom%DEALLOCATE() +CALL fedof%DEALLOCATE() +CALL meshfile%DEALLOCATE() + +END PROGRAM main diff --git a/docs/docs-api/VectorField/examples/runner.toml b/docs/docs-api/VectorField/examples/runner.toml new file mode 100644 index 00000000..738ac959 --- /dev/null +++ b/docs/docs-api/VectorField/examples/runner.toml @@ -0,0 +1,3 @@ +BuildType = "Debug" +BuildDir = "/tmp/easifem-tests/VectorField/" +TargetLibs = ["easifemClasses"] diff --git a/docs/docs-api/VectorField/examples/toml/VectorField.toml b/docs/docs-api/VectorField/examples/toml/VectorField.toml new file mode 100644 index 00000000..7ab95f77 --- /dev/null +++ b/docs/docs-api/VectorField/examples/toml/VectorField.toml @@ -0,0 +1,19 @@ +[field1] +name = "field1" +engine = "NATIVE_SERIAL" +fieldType = "Normal" +spaceCompo = 2 +# space component, the default value is 1 +# for scalar fields you can omit this +# for vector fields you must specify this value + +fedofName = "space" +# fedofName contains the name of the subtable which +# contains the fedof data for this field. + +[field1.space] +baseContinuity = "H1" +baseInterpolation = "Lagrange" +ipType = "Equidistance" +order = 1 + diff --git a/docs/guides/programming-fem/dirichletBC/index.mdx b/docs/guides/programming-fem/dirichletBC/index.mdx index effe20b9..2e9f4a13 100644 --- a/docs/guides/programming-fem/dirichletBC/index.mdx +++ b/docs/guides/programming-fem/dirichletBC/index.mdx @@ -30,7 +30,7 @@ $$ \mathbf{u} = \mathbf{U}_{0}, \text{ on } \Gamma $$ -Now, we may think that there is only one boundary condition. But in easifem this is not the case. Actually, $\mathbf{u}$, has three components in 3D (and two components in 2D). Therefore, the above boundary condition is actually boundary condition for $u_x$, $u_y$, and $u_z$. So, we have three boundary condition on a given boundary $\Gamma$. +We may think that there is only one boundary condition. But in easifem this is not the case. Actually, $\mathbf{u}$, has three components in 3D (and two components in 2D). Therefore, the above boundary condition is actually boundary condition for $u_x$, $u_y$, and $u_z$. So, we have three boundary condition on a given boundary $\Gamma$. The second point, which is quite obvious, is that every boundary condition has two things: diff --git a/docs/partials/_product-section.mdx b/docs/partials/_product-section.mdx index 4755d33f..a6c9a482 100644 --- a/docs/partials/_product-section.mdx +++ b/docs/partials/_product-section.mdx @@ -1,9 +1,9 @@ import { - FlashRegular, - ArrowDownloadRegular, - CodeRegular, - CodeTextEditRegular, -} from '@fluentui/react-icons'; + Zap, + Download, + Code, + Edit +} from 'react-feather'; } + icon={} to="/guides/getting-started/" description="Getting started with easifem, quickly install and run a hello world program!" /> } + icon={} to="/guides/install" description="Get detailed information about installation, configuration, dependencies of easifem" /> } + icon={} to="/guides/using-easifem" description="Learn how to build and link applications with easifem." /> } + icon={} to="/guides/ide" description="Learn how to configure language server for development with easifem in VSCode and Neovim" /> diff --git a/docusaurus.config.js b/docusaurus.config.js index f52d1877..a85c1393 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -65,6 +65,11 @@ const defaultSettings = { rehypePlugins: [[katex, { strict: false }]], }; +const defaultBlogSettings = { + remarkPlugins: [math], + rehypePlugins: [[katex, { strict: false }]], +}; + /** * Create a section * @param {import('@docusaurus/plugin-content-docs').Options} options @@ -119,6 +124,7 @@ const config = { path: "docs/blog", id: "blog", routeBasePath: "/blog", + ...defaultBlogSettings, }, // commenting the theme theme: { @@ -157,6 +163,7 @@ const config = { docs: { sidebar: { hideable: true, + autoCollapseCategories: true, }, }, navbar: { diff --git a/package.json b/package.json index 876a7d89..2b47dc63 100644 --- a/package.json +++ b/package.json @@ -16,17 +16,16 @@ }, "dependencies": { "@algolia/client-search": "^4.20.0", - "@docusaurus/core": "^3.8.0", - "@docusaurus/faster": "^3.8.0", - "@docusaurus/module-type-aliases": "^3.8.0", - "@docusaurus/plugin-client-redirects": "^3.8.0", - "@docusaurus/plugin-content-docs": "^3.8.0", - "@docusaurus/plugin-css-cascade-layers": "^3.8.0", - "@docusaurus/preset-classic": "^3.8.0", - "@docusaurus/theme-common": "^3.8.0", - "@fluentui/react-icons": "^2.0.271", + "@docusaurus/core": "^3.8.1", + "@docusaurus/faster": "^3.8.1", + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/plugin-client-redirects": "^3.8.1", + "@docusaurus/plugin-content-docs": "^3.8.1", + "@docusaurus/plugin-css-cascade-layers": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/theme-common": "^3.8.1", "@mdx-js/react": "^3.1.0", - "@tanstack/react-table": "latest", + "@tanstack/react-table": "^8.21.3", "@types/react": "^18.2.0", "clsx": "^2.1.1", "docusaurus-plugin-drawio": "^0.4.0", @@ -37,26 +36,27 @@ "prism-react-renderer": "^2.3.1", "prismjs": "^1.29.0", "raw-loader": "^4.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-feather": "^2.0.10", "react-loadable": "^5.5.0", "rehype-katex": "^7.0.0", "remark-math": "^6.0.0", - "search-insights": "^2.8.0" + "search-insights": "^2.8.0", + "webpack": "^5.95.0" }, "devDependencies": { - "@docusaurus/tsconfig": "^3.8.0", - "@docusaurus/types": "^3.8.0", + "@docusaurus/tsconfig": "^3.8.1", + "@docusaurus/types": "^3.8.1", "@radix-ui/react-select": "^2.1.1", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", "autoprefixer": "^10.4.19", "buffer": "^6.0.3", "docusaurus-plugin-typedoc": "^0.18.0", "eslint": "^8.57.0", - "eslint-config-prettier": "^8.10.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", "js-yaml": "^4.1.0", "pascal-case": "^3.1.2", "path-browserify": "^1.0.1", @@ -90,15 +90,5 @@ "prettier": { "singleQuote": true, "tabWidth": 2 - }, - "config": { - "commitizen": { - "path": "./node_modules/cz-conventional-changelog" - } - }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] } } diff --git a/src/components/homepage/GuidesAndSamples.tsx b/src/components/homepage/GuidesAndSamples.tsx index f66517de..3d063a08 100644 --- a/src/components/homepage/GuidesAndSamples.tsx +++ b/src/components/homepage/GuidesAndSamples.tsx @@ -1,18 +1,15 @@ import Link from "@docusaurus/Link"; import { - AppsAddInRegular, - ArrowRightFilled, - CodeCircleRegular, - CubeRegular, - DesktopRegular, - DeveloperBoardRegular, - DocumentRegular, - OpenRegular, - RecordRegular, -} from "@fluentui/react-icons"; + ChevronRight, + Code, + Monitor, + Cpu, + FileText, + ExternalLink, + GitHub, +} from "react-feather"; import clsx from "clsx"; import React from "react"; -import { ChevronRight, GitHub } from "react-feather"; interface Guide { title: string; @@ -24,19 +21,19 @@ interface Guide { const guides: Guide[] = [ { title: "Getting started with easifemBase and easifemClasses", - icon: CodeCircleRegular, + icon: Code, text: "Quick installation of easifemBase, easifemClasses, and run some sample programs.", link: "/guides/getting-started", }, { title: "A simple 💫 Hello World 🚀 program", - icon: DesktopRegular, + icon: Monitor, text: "Run a hello world program by using easifem.", link: "guides/learn-by-examples/hello-world", }, { title: "Getting started with strings", - icon: DeveloperBoardRegular, + icon: Cpu, text: "Strings in easifem", link: "/guides/programming-basics/string", }, @@ -105,13 +102,13 @@ function Sample({ title, platform, blog, source, demo }: Sample) {
{blog && ( - + )} {demo && ( - + )} @@ -137,7 +134,7 @@ export default function GuidesAndSamples() {

Getting started guides 📚

- View more guides + View more guides
@@ -161,7 +158,7 @@ export default function GuidesAndSamples() { to="https://github.com/vickysharma0812" className="font-jakarta text-sm font-semibold" > - All apps + All apps diff --git a/src/components/homepage/HeroSection.tsx b/src/components/homepage/HeroSection.tsx index cb79cfdd..cf49bb57 100644 --- a/src/components/homepage/HeroSection.tsx +++ b/src/components/homepage/HeroSection.tsx @@ -1,14 +1,14 @@ import Link from "@docusaurus/Link"; import { - AppFolderRegular, - BlurRegular, - BoardRegular, - BoxRegular, - ChatMultipleRegular, - LiveRegular, - MicRegular, - VideoRegular, -} from "@fluentui/react-icons"; + Folder, + EyeOff, + Layout, + Package, + MessageCircle, + Radio, + Mic, + Video, +} from "react-feather"; import { DiscordIcon, EasifemIcon } from "@site/src/icons"; import ThemedImage from "@theme/ThemedImage"; import clsx from "clsx"; @@ -18,7 +18,7 @@ const PRODUCTS = [ { title: "easifemBase", link: "/about/easifemBase", - icon: AppFolderRegular, + icon: Folder, lightImage: "/static/landing-page/hero/easifemBase-light.svg", darkImage: "/static/landing-page/hero/easifemBase-dark.svg", text: "Base library for easifem.", @@ -26,7 +26,7 @@ const PRODUCTS = [ { title: "easifemClasses", link: "/about/easifemClasses", - icon: BlurRegular, + icon: EyeOff, lightImage: "/static/landing-page/hero/easifemClasses-light.svg", darkImage: "/static/landing-page/hero/easifemClasses-dark.svg", text: "High level classes and objects for numerical methods and algorithms.", diff --git a/src/components/homepage/Install.tsx b/src/components/homepage/Install.tsx index 141a471c..c36bcf65 100644 --- a/src/components/homepage/Install.tsx +++ b/src/components/homepage/Install.tsx @@ -1,13 +1,26 @@ import Link from "@docusaurus/Link"; import React from "react"; +import { Monitor, Server, Award, Cpu, HardDrive } from "react-feather"; -function SDK({ icon, to, name }: { icon: string; name: string; to?: string }) { +// Map of distro names to react-feather icons +const iconMap = { + 'Ubuntu': Server, + 'Archlinux': Cpu, + 'Fedora': Server, + 'Debian': Server, + 'M1/M2 chip(ARM64)': Monitor, + 'Intel chip(AMD64, x86)': HardDrive +}; + +function SDK({ name, to }: { name: string; to?: string }) { + const IconComponent = iconMap[name] || Award; + return ( - + {name} ); @@ -33,22 +46,18 @@ export default function Install() { @@ -64,12 +73,10 @@ export default function Install() { diff --git a/src/components/homepage/ResourcesSection.tsx b/src/components/homepage/ResourcesSection.tsx index 6f64f751..d42537f2 100644 --- a/src/components/homepage/ResourcesSection.tsx +++ b/src/components/homepage/ResourcesSection.tsx @@ -1,5 +1,5 @@ import Link from "@docusaurus/Link"; -import { ArrowRightFilled, ChevronLeftRegular, ChevronRightRegular } from "@fluentui/react-icons"; +import { ChevronRight, ChevronLeft } from "react-feather"; import clsx from "clsx"; import React, { useState } from "react"; @@ -131,7 +131,7 @@ export default function ResourcesSection() { to="https://dyte.io/blog" className="font-jakarta text-sm font-semibold text-primary" > - All Blogs + All Blogs @@ -180,14 +180,14 @@ export default function ResourcesSection() { onClick={prevPage} className="top-1/2 -left-14 rounded-lg bg-transparent p-1 hover:bg-secondary-800 md:absolute md:-translate-y-1/2" > - + diff --git a/src/css/custom.css b/src/css/custom.css index fa14a9b6..6f157521 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -141,12 +141,13 @@ html[data-theme='dark'] { /* Background colors */ --docs-color-background: var(--cat-base); - --docs-color-background-100: var(--cat-mantle); - --docs-color-background-200: var(--cat-crust); - --docs-color-background-300: var(--cat-surface0); - --ifm-background-surface-color: var(--cat-base); --ifm-background-color: var(--cat-base); - --ifm-footer-background-color: var(--cat-surface0); + --docs-color-background-100: var(--cat-base); + --docs-color-background-200: var(--cat-mantle); + --docs-color-background-300: var(--cat-crust); + --ifm-background-surface-color: var(--cat-surface0); + --ifm-footer-background-color: var(--cat-crust); + --ifm-navbar-background-color: var(--cat-base); /* Border and text colors */ --docs-color-border: var(--cat-surface1); @@ -219,6 +220,34 @@ html[data-theme='dark'] { .homepage section * { @apply box-border; } + +h1 { + color: var(--ifm-color-primary); +} + +h2 { + color: var(--cat-lavender); +} + +h3 { + color: var(--cat-blue); +} + +h4 { + color: var(--cat-text); +} + +} + +html[data-theme='dark'] { + /* Add these lines to override background colors for dark mode */ + --docs-color-background: var(--cat-base); + --ifm-background-color: var(--cat-base); + --docs-color-background-100: var(--cat-base); + --docs-color-background-200: var(--cat-mantle); + --docs-color-background-300: var(--cat-crust); + --ifm-background-surface-color: var(--cat-surface0); + --ifm-navbar-background-color: var(--cat-base); } /* Components */ @@ -252,12 +281,33 @@ pre, code { } /* Navigation and UI Components */ -nav.navbar { - border-bottom: 0.5px solid var(--ifm-toc-border-color); +/* nav.navbar { */ +/* border-bottom: 0.5px solid var(--ifm-toc-border-color); */ +/* } */ + +/* pre.prism-code { */ +/* border: 0.5px solid var(--code-border-color); */ +/* } */ + +/* Making code block scrollable */ +pre { + max-height: 400px; + overflow-y: auto; +} + +pre code { + display: block; + white-space: pre; } -pre.prism-code { - border: 0.5px solid var(--code-border-color); +pre.prism-code, +.theme-code-block pre, +:not(pre) > code { + border: none !important; + /* border-left: 0.5px solid var(--code-border-color) !important; */ + /* border-right: 0.5px solid var(--code-border-color) !important; */ + /* border-top: 0 !important; */ + /* border-bottom: 0 !important; */ } .navbar__item, @@ -336,13 +386,14 @@ nav.menu { display: inline-block; padding: 0.25rem 1.5rem; border-radius: 4px; - background-color: var(--ifm-color-primary); - color: var(--ifm-text-color); + background-color: var(--cat-mauve); + color: var(--ifm-background-color); text-decoration: none; + font-weight: 600; } .footer__cta a:hover { - background-color: var(--ifm-color-primary-darker); + background-color: var(--cat-mauve); /* color: var(--ifm-color-primary); */ } @@ -356,7 +407,7 @@ nav.menu { .footer__title { font-size: 14px; - font-weight: normal; + font-weight: bold; @apply mb-2 text-text-400; } @@ -436,6 +487,7 @@ nav.menu { aside.theme-doc-sidebar-container { position: relative; clip-path: inset(0px -140px); + border-right: none !important; } .theme-doc-sidebar-container button[title='Collapse sidebar'], diff --git a/src/icons/index.tsx b/src/icons/index.tsx index 00745408..259d3534 100644 --- a/src/icons/index.tsx +++ b/src/icons/index.tsx @@ -86,63 +86,63 @@ export function EasifemIcon(props: ComponentProps<"svg">) { @@ -624,8 +624,8 @@ export function CodepenIcon(props: ComponentProps<"svg">) { export function ArchLinuxIcon(props: ComponentProps<"svg">) { return (