/ClassicalField/Poisson/AnalyticNonlinearPoisson/src/AnalyticNonlinearPoissonExample.f90

http://github.com/xyan075/examples · Fortran Modern · 421 lines · 248 code · 53 blank · 120 comment · 4 complexity · 6926dae0b398f5e3afdc2f7943f5d90a MD5 · raw file

  1. !> \file
  2. !> \author Chris Bradley
  3. !> \brief This is an example program to solve a nonlinear Poisson equation using OpenCMISS calls.
  4. !>
  5. !> \section LICENSE
  6. !>
  7. !> Version: MPL 1.1/GPL 2.0/LGPL 2.1
  8. !>
  9. !> The contents of this file are subject to the Mozilla Public License
  10. !> Version 1.1 (the "License"); you may not use this file except in
  11. !> compliance with the License. You may obtain a copy of the License at
  12. !> http://www.mozilla.org/MPL/
  13. !>
  14. !> Software distributed under the License is distributed on an "AS IS"
  15. !> basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  16. !> License for the specific language governing rights and limitations
  17. !> under the License.
  18. !>
  19. !> The Original Code is OpenCMISS
  20. !>
  21. !> The Initial Developer of the Original Code is University of Auckland,
  22. !> Auckland, New Zealand and University of Oxford, Oxford, United
  23. !> Kingdom. Portions created by the University of Auckland and University
  24. !> of Oxford are Copyright (C) 2007 by the University of Auckland and
  25. !> the University of Oxford. All Rights Reserved.
  26. !>
  27. !> Contributor(s):
  28. !>
  29. !> Alternatively, the contents of this file may be used under the terms of
  30. !> either the GNU General Public License Version 2 or later (the "GPL"), or
  31. !> the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  32. !> in which case the provisions of the GPL or the LGPL are applicable instead
  33. !> of those above. If you wish to allow use of your version of this file only
  34. !> under the terms of either the GPL or the LGPL, and not to allow others to
  35. !> use your version of this file under the terms of the MPL, indicate your
  36. !> decision by deleting the provisions above and replace them with the notice
  37. !> and other provisions required by the GPL or the LGPL. If you do not delete
  38. !> the provisions above, a recipient may use your version of this file under
  39. !> the terms of any one of the MPL, the GPL or the LGPL.
  40. !>
  41. !> \example ClassicalField/Poisson/AnalyticNonlinearPoisson/src/NonlinearPoissonExample.f90
  42. !! Example program to solve a nonlinear Poisson equation using openCMISS calls.
  43. !! \htmlinclude ClassicalField/Poisson/AnalyticNonlinearPoisson/history.html
  44. !<
  45. !> Main program
  46. PROGRAM NONLINEARPOISSONEXAMPLE
  47. USE OPENCMISS
  48. USE MPI
  49. #ifdef WIN32
  50. USE IFQWIN
  51. #endif
  52. IMPLICIT NONE
  53. !Test program parameters
  54. REAL(CMISSDP), PARAMETER :: HEIGHT=0.5_CMISSDP
  55. REAL(CMISSDP), PARAMETER :: WIDTH=0.5_CMISSDP
  56. REAL(CMISSDP), PARAMETER :: LENGTH=1.0_CMISSDP
  57. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystemUserNumber=1
  58. INTEGER(CMISSIntg), PARAMETER :: RegionUserNumber=2
  59. INTEGER(CMISSIntg), PARAMETER :: BasisUserNumber=3
  60. INTEGER(CMISSIntg), PARAMETER :: GeneratedMeshUserNumber=4
  61. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=5
  62. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=6
  63. INTEGER(CMISSIntg), PARAMETER :: GeometricFieldUserNumber=7
  64. INTEGER(CMISSIntg), PARAMETER :: DependentFieldUserNumber=8
  65. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumber=9
  66. INTEGER(CMISSIntg), PARAMETER :: AnalyticFieldUserNumber=10
  67. INTEGER(CMISSIntg), PARAMETER :: EquationsSetUserNumber=11
  68. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=12
  69. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumber=13
  70. !Program variables
  71. INTEGER(CMISSIntg) :: NUMBER_DIMENSIONS,INTERPOLATION_TYPE,NUMBER_OF_GAUSS_XI
  72. INTEGER(CMISSIntg) :: NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS,NUMBER_GLOBAL_Z_ELEMENTS
  73. INTEGER(CMISSIntg) :: component_idx
  74. INTEGER(CMISSIntg) :: NUMBER_OF_ARGUMENTS,ARGUMENT_LENGTH,STATUS
  75. CHARACTER(LEN=255) :: COMMAND_ARGUMENT
  76. LOGICAL :: EXPORT_FIELD
  77. !CMISS variables
  78. TYPE(CMISSBasisType) :: Basis
  79. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem,WorldCoordinateSystem
  80. TYPE(CMISSDecompositionType) :: Decomposition
  81. TYPE(CMISSEquationsType) :: Equations
  82. TYPE(CMISSEquationsSetType) :: EquationsSet
  83. TYPE(CMISSFieldType) :: GeometricField,DependentField,MaterialsField,AnalyticField
  84. TYPE(CMISSFieldsType) :: Fields
  85. TYPE(CMISSGeneratedMeshType) :: GeneratedMesh
  86. TYPE(CMISSMeshType) :: Mesh
  87. TYPE(CMISSProblemType) :: Problem
  88. TYPE(CMISSRegionType) :: Region,WorldRegion
  89. TYPE(CMISSSolverType) :: Solver,LinearSolver
  90. TYPE(CMISSSolverEquationsType) :: SolverEquations
  91. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditions
  92. TYPE(CMISSFieldType) :: EquationsSetField
  93. !Generic CMISS variables
  94. INTEGER(CMISSIntg) :: EquationsSetIndex
  95. INTEGER(CMISSIntg) :: Err
  96. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,ComputationalNodeNumber
  97. #ifdef WIN32
  98. !Quickwin type
  99. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  100. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  101. !Initialise QuickWin
  102. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  103. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  104. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  105. !Set the window parameters
  106. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  107. !If attempt fails set with system estimated values
  108. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  109. #endif
  110. !Get input arguments
  111. NUMBER_OF_ARGUMENTS = COMMAND_ARGUMENT_COUNT()
  112. IF(NUMBER_OF_ARGUMENTS >= 4) THEN
  113. !If we have enough arguments then use the first four for setting up the problem. The subsequent arguments may be used to
  114. !pass flags to, say, PETSc.
  115. CALL GET_COMMAND_ARGUMENT(1,COMMAND_ARGUMENT,ARGUMENT_LENGTH,STATUS)
  116. IF(STATUS>0) CALL HANDLE_ERROR("Error for command argument 1.")
  117. READ(COMMAND_ARGUMENT(1:ARGUMENT_LENGTH),*) NUMBER_GLOBAL_X_ELEMENTS
  118. IF(NUMBER_GLOBAL_X_ELEMENTS<=0) CALL HANDLE_ERROR("Invalid number of X elements.")
  119. CALL GET_COMMAND_ARGUMENT(2,COMMAND_ARGUMENT,ARGUMENT_LENGTH,STATUS)
  120. IF(STATUS>0) CALL HANDLE_ERROR("Error for command argument 2.")
  121. READ(COMMAND_ARGUMENT(1:ARGUMENT_LENGTH),*) NUMBER_GLOBAL_Y_ELEMENTS
  122. IF(NUMBER_GLOBAL_Y_ELEMENTS<0) CALL HANDLE_ERROR("Invalid number of Y elements.")
  123. CALL GET_COMMAND_ARGUMENT(3,COMMAND_ARGUMENT,ARGUMENT_LENGTH,STATUS)
  124. IF(STATUS>0) CALL HANDLE_ERROR("Error for command argument 3.")
  125. READ(COMMAND_ARGUMENT(1:ARGUMENT_LENGTH),*) NUMBER_GLOBAL_Z_ELEMENTS
  126. IF(NUMBER_GLOBAL_Z_ELEMENTS<0) CALL HANDLE_ERROR("Invalid number of Z elements.")
  127. CALL GET_COMMAND_ARGUMENT(4,COMMAND_ARGUMENT,ARGUMENT_LENGTH,STATUS)
  128. IF(STATUS>0) CALL HANDLE_ERROR("Error for command argument 4.")
  129. READ(COMMAND_ARGUMENT(1:ARGUMENT_LENGTH),*) INTERPOLATION_TYPE
  130. IF(INTERPOLATION_TYPE<=0) CALL HANDLE_ERROR("Invalid Interpolation specification.")
  131. IF(NUMBER_GLOBAL_Z_ELEMENTS>0) THEN
  132. NUMBER_DIMENSIONS=3
  133. ELSEIF(NUMBER_GLOBAL_Y_ELEMENTS>0) THEN
  134. NUMBER_DIMENSIONS=2
  135. ELSE
  136. NUMBER_DIMENSIONS=1
  137. ENDIF
  138. ELSE
  139. !If there are not enough arguments default the problem specification
  140. NUMBER_DIMENSIONS=2
  141. NUMBER_GLOBAL_X_ELEMENTS=5
  142. NUMBER_GLOBAL_Y_ELEMENTS=5
  143. NUMBER_GLOBAL_Z_ELEMENTS=0
  144. INTERPOLATION_TYPE=1
  145. ENDIF
  146. !Intialise OpenCMISS
  147. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  148. !Trap all errors
  149. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  150. !Output to a file
  151. CALL CMISSOutputSetOn("NonlinearPoisson",Err)
  152. !Get the computational nodes information
  153. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  154. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  155. !Start the creation of a new RC coordinate system
  156. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  157. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  158. !Set the coordinate system number of dimensions
  159. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NUMBER_DIMENSIONS,Err)
  160. !Finish the creation of the coordinate system
  161. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  162. !Start the creation of the region
  163. CALL CMISSRegion_Initialise(Region,Err)
  164. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  165. !Set the regions coordinate system to the 2D RC coordinate system that we have created
  166. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  167. !Finish the creation of the region
  168. CALL CMISSRegion_CreateFinish(Region,Err)
  169. !Start the creation of a basis (default is trilinear lagrange)
  170. CALL CMISSBasis_Initialise(Basis,Err)
  171. CALL CMISSBasis_CreateStart(BasisUserNumber,Basis,Err)
  172. CALL CMISSBasis_NumberOfXiSet(Basis,NUMBER_DIMENSIONS,Err)
  173. SELECT CASE(INTERPOLATION_TYPE)
  174. CASE(1,2,3,4)
  175. CALL CMISSBasis_TypeSet(Basis,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  176. CASE(7,8,9)
  177. CALL CMISSBasis_TypeSet(Basis,CMISS_BASIS_SIMPLEX_TYPE,Err)
  178. CASE DEFAULT
  179. CALL HANDLE_ERROR("Invalid interpolation type.")
  180. END SELECT
  181. SELECT CASE(INTERPOLATION_TYPE)
  182. CASE(1)
  183. NUMBER_OF_GAUSS_XI=2
  184. CASE(2)
  185. NUMBER_OF_GAUSS_XI=3
  186. CASE(3,4)
  187. NUMBER_OF_GAUSS_XI=4
  188. CASE DEFAULT
  189. NUMBER_OF_GAUSS_XI=0
  190. END SELECT
  191. IF(NUMBER_DIMENSIONS==1) THEN
  192. CALL CMISSBasis_InterpolationXiSet(Basis,[INTERPOLATION_TYPE],Err)
  193. IF(NUMBER_OF_GAUSS_XI>0) THEN
  194. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(Basis,[NUMBER_OF_GAUSS_XI],Err)
  195. ENDIF
  196. ELSEIF(NUMBER_DIMENSIONS==2) THEN
  197. CALL CMISSBasis_InterpolationXiSet(Basis,[INTERPOLATION_TYPE,INTERPOLATION_TYPE],Err)
  198. IF(NUMBER_OF_GAUSS_XI>0) THEN
  199. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(Basis,[NUMBER_OF_GAUSS_XI,NUMBER_OF_GAUSS_XI],Err)
  200. ENDIF
  201. ELSE
  202. CALL CMISSBasis_InterpolationXiSet(Basis,[INTERPOLATION_TYPE,INTERPOLATION_TYPE,INTERPOLATION_TYPE],Err)
  203. IF(NUMBER_OF_GAUSS_XI>0) THEN
  204. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(Basis,[NUMBER_OF_GAUSS_XI,NUMBER_OF_GAUSS_XI,NUMBER_OF_GAUSS_XI],Err)
  205. ENDIF
  206. ENDIF
  207. !Finish the creation of the basis
  208. CALL CMISSBasis_CreateFinish(Basis,Err)
  209. !Start the creation of a generated mesh in the region
  210. CALL CMISSGeneratedMesh_Initialise(GeneratedMesh,Err)
  211. CALL CMISSGeneratedMesh_CreateStart(GeneratedMeshUserNumber,Region,GeneratedMesh,Err)
  212. !Set up a regular x*y*z mesh
  213. CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh,CMISS_GENERATED_MESH_REGULAR_MESH_TYPE,Err)
  214. !Set the default basis
  215. CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh,Basis,Err)
  216. !Define the mesh on the region
  217. IF(NUMBER_DIMENSIONS==1) THEN
  218. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,[WIDTH],Err)
  219. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,[NUMBER_GLOBAL_X_ELEMENTS],Err)
  220. ELSEIF(NUMBER_DIMENSIONS==2) THEN
  221. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,[WIDTH,HEIGHT],Err)
  222. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,[NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS],Err)
  223. ELSE
  224. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,[WIDTH,HEIGHT,LENGTH],Err)
  225. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,[NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS, &
  226. & NUMBER_GLOBAL_Z_ELEMENTS],Err)
  227. ENDIF
  228. !Finish the creation of a generated mesh in the region
  229. CALL CMISSMesh_Initialise(Mesh,Err)
  230. CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh,MeshUserNumber,Mesh,Err)
  231. !Create a decomposition
  232. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  233. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  234. !Set the decomposition to be a general decomposition with the specified number of domains
  235. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  236. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,NumberOfComputationalNodes,Err)
  237. !Finish the decomposition
  238. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  239. !Start to create a default (geometric) field on the region
  240. CALL CMISSField_Initialise(GeometricField,Err)
  241. CALL CMISSField_CreateStart(GeometricFieldUserNumber,Region,GeometricField,Err)
  242. !Set the decomposition to use
  243. CALL CMISSField_MeshDecompositionSet(GeometricField,Decomposition,Err)
  244. !Set the domain to be used by the field components.
  245. DO component_idx=1,NUMBER_DIMENSIONS
  246. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,component_idx,1,Err)
  247. ENDDO
  248. !Finish creating the field
  249. CALL CMISSField_CreateFinish(GeometricField,Err)
  250. !Update the geometric field parameters
  251. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricField,Err)
  252. !Create the equations_set
  253. CALL CMISSEquationsSet_Initialise(EquationsSet,Err)
  254. CALL CMISSField_Initialise(EquationsSetField,Err)
  255. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumber,Region,GeometricField,CMISS_EQUATIONS_SET_CLASSICAL_FIELD_CLASS, &
  256. & CMISS_EQUATIONS_SET_POISSON_EQUATION_TYPE,CMISS_EQUATIONS_SET_EXPONENTIAL_SOURCE_POISSON_SUBTYPE, &
  257. & EquationsSetFieldUserNumber, &
  258. & EquationsSetField,EquationsSet,Err)
  259. !Finish creating the equations set
  260. CALL CMISSEquationsSet_CreateFinish(EquationsSet,Err)
  261. !Create the equations set dependent field variables
  262. CALL CMISSField_Initialise(DependentField,Err)
  263. CALL CMISSEquationsSet_DependentCreateStart(EquationsSet,DependentFieldUserNumber,DependentField,Err)
  264. !Finish the equations set dependent field variables
  265. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSet,Err)
  266. !Initialise the field to zero
  267. CALL CMISSField_ComponentValuesInitialise(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,0.0_CMISSDP, &
  268. & Err)
  269. !Create the equations set material field variables
  270. CALL CMISSField_Initialise(MaterialsField,Err)
  271. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSet,MaterialsFieldUserNumber,MaterialsField,Err)
  272. !Finish the equations set dependent field variables
  273. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSet,Err)
  274. !Create the equations set analytic field variables
  275. CALL CMISSField_Initialise(AnalyticField,Err)
  276. IF(NUMBER_DIMENSIONS==2) THEN
  277. CALL CMISSEquationsSet_AnalyticCreateStart(EquationsSet,CMISS_EQUATIONS_SET_POISSON_EQUATION_TWO_DIM_1, &
  278. & AnalyticFieldUserNumber, &
  279. & AnalyticField, &
  280. & Err)
  281. ELSE
  282. WRITE(*,'(A)') "One and three dimensions are not implemented."
  283. STOP
  284. ENDIF
  285. !Finish the equations set analytic field variables
  286. CALL CMISSEquationsSet_AnalyticCreateFinish(EquationsSet,Err)
  287. !Create the equations set equations
  288. CALL CMISSEquations_Initialise(Equations,Err)
  289. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSet,Equations,Err)
  290. !Set the equations matrices sparsity type
  291. CALL CMISSEquations_SparsityTypeSet(Equations,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  292. !Set the equations set output
  293. CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_NO_OUTPUT,Err)
  294. !Finish the equations set equations
  295. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSet,Err)
  296. !Start the creation of a problem.
  297. CALL CMISSProblem_Initialise(Problem,Err)
  298. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  299. !Set the problem to be a standard Poisson problem
  300. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_CLASSICAL_FIELD_CLASS,CMISS_PROBLEM_POISSON_EQUATION_TYPE, &
  301. & CMISS_PROBLEM_NONLINEAR_SOURCE_POISSON_SUBTYPE,Err)
  302. !Finish the creation of a problem.
  303. CALL CMISSProblem_CreateFinish(Problem,Err)
  304. !Start the creation of the problem control loop
  305. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  306. !Finish creating the problem control loop
  307. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  308. !Start the creation of the problem solvers
  309. CALL CMISSSolver_Initialise(Solver,Err)
  310. CALL CMISSSolver_Initialise(LinearSolver,Err)
  311. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  312. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,1,Solver,Err)
  313. !Set the solver output
  314. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_NO_OUTPUT,Err)
  315. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  316. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_TIMING_OUTPUT,Err)
  317. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_SOLVER_OUTPUT,Err)
  318. CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_MATRIX_OUTPUT,Err)
  319. !Set the Jacobian type
  320. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(Solver,CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED,Err)
  321. !CALL CMISSSolver_NewtonJacobianCalculationTypeSet(Solver,CMISS_SOLVER_NEWTON_JACOBIAN_FD_CALCULATED,Err)
  322. !Get the associated linear solver
  323. CALL CMISSSolver_NewtonLinearSolverGet(Solver,LinearSolver,Err)
  324. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolver,500,Err)
  325. !Finish the creation of the problem solver
  326. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  327. !Start the creation of the problem solver equations
  328. CALL CMISSSolver_Initialise(Solver,Err)
  329. CALL CMISSSolverEquations_Initialise(SolverEquations,Err)
  330. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  331. !Get the solve equations
  332. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,1,Solver,Err)
  333. CALL CMISSSolver_SolverEquationsGet(Solver,SolverEquations,Err)
  334. !Set the solver equations sparsity
  335. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquations,CMISS_SOLVER_SPARSE_MATRICES,Err)
  336. !CALL CMISSSolverEquations_SparsityTypeSet(SolverEquations,CMISS_SOLVER_FULL_MATRICES,Err)
  337. !Add in the equations set
  338. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquations,EquationsSet,EquationsSetIndex,Err)
  339. !Finish the creation of the problem solver equations
  340. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  341. !Set up the boundary conditions as per the analytic solution
  342. CALL CMISSBoundaryConditions_Initialise(BoundaryConditions,Err)
  343. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquations,BoundaryConditions,Err)
  344. CALL CMISSSolverEquations_BoundaryConditionsAnalytic(SolverEquations,Err)
  345. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquations,Err)
  346. !Solve the problem
  347. CALL CMISSProblem_Solve(Problem,Err)
  348. !Output Analytic analysis
  349. Call CMISSAnalyticAnalysisOutput(DependentField,"",Err)
  350. EXPORT_FIELD=.TRUE.
  351. IF(EXPORT_FIELD) THEN
  352. CALL CMISSFields_Initialise(Fields,Err)
  353. CALL CMISSFields_Create(Region,Fields,Err)
  354. CALL CMISSFields_NodesExport(Fields,"NonlinearPoisson","FORTRAN",Err)
  355. CALL CMISSFields_ElementsExport(Fields,"NonlinearPoisson","FORTRAN",Err)
  356. CALL CMISSFields_Finalise(Fields,Err)
  357. ENDIF
  358. !Finialise CMISS
  359. CALL CMISSFinalise(Err)
  360. WRITE(*,'(A)') "Program successfully completed."
  361. STOP
  362. CONTAINS
  363. SUBROUTINE HANDLE_ERROR(ERROR_STRING)
  364. CHARACTER(LEN=*), INTENT(IN) :: ERROR_STRING
  365. WRITE(*,'(">>ERROR: ",A)') ERROR_STRING(1:LEN_TRIM(ERROR_STRING))
  366. STOP
  367. END SUBROUTINE HANDLE_ERROR
  368. END PROGRAM NONLINEARPOISSONEXAMPLE