37 #include "../config.h"
53 INTEGER :: runs, counter, nindex, verbin
55 REAL(KIND=dp) :: ct, rt
57 CHARACTER(LEN=MAX_NAME_LEN) :: datestr, toutput
58 INTEGER,
POINTER :: tempnodelist(:)
59 LOGICAL :: nodepresent
60 INTEGER :: lastfsielement
66 WRITE(6,*)
'ElmerCSC:Initializer: Starting ...'
69 ALLOCATE(global%verbosity(1))
71 global%verbosity = verbin
73 WRITE(*,*)
'verbosity = ', global%verbosity
75 CALL envir(
'ELMERSOLVER_OUTPUT_TOTAL'//char(0), toutput, tlen )
76 silent = toutput(1:1)==
'0' .OR. toutput(1:5)==
'false'
81 IF ( .NOT. silent )
THEN
82 datestr = formatdate()
83 WRITE( *,
'(A,A)' )
"ELMER SOLVER (v " // version //
") STARTED AT: ", trim(datestr)
87 IF( myverbosity > 3)
WRITE( *, * )
'Calling ElmerInitialize'
91 global%MyModel => currentmodel
95 DO i=1, currentmodel % NumberOfSolvers
96 solver => global % MyModel % Solvers(i)
97 solverparams => getsolverparams(solver)
98 equation = getstring(solverparams,
'Equation', gotit)
99 WRITE(*,*)
'Equation = ',equation
100 IF( equation .eq.
'nonlinear elasticity' )
THEN
103 ELSE IF( equation .eq.
'linear elasticity' )
THEN
111 DO t=1,currentmodel % NumberOfBCs
112 isfsi = listgetlogical(currentmodel % BCs(t) % Values,&
115 IF (myverbosity > 3)
WRITE(*,*)
'BC', t,
'is FSI'
120 IF (global%FSIbcId == -1)
THEN
121 WRITE(*,*)
'Not registering data no FSI BC!'
127 mymesh => currentmodel % Meshes
132 t = mymesh % NumberOfBulkElements
133 mycurrentelement => mymesh % Elements(t+1)
134 t = mycurrentelement % TYPE % DIMENSION
135 counter = (mymesh % NumberOfBoundaryElements)*(t + 1)
136 ALLOCATE(tempnodelist(counter))
141 DO t = mymesh % NumberOfBulkElements+1, &
142 mymesh % NumberOfBulkElements + &
143 mymesh % NumberOfBoundaryElements
145 mycurrentelement => mymesh % Elements(t)
146 bc_id = getbcid(mycurrentelement)
148 IF ( bc_id == global%FSIbcId )
THEN
150 IF( myverbosity > 3)
THEN
151 WRITE(*,*)
'Initializer element = ',t,
' bc_id = ',bc_id
153 global%nElem = global%nElem + 1
154 DO nt = 1,mycurrentelement % TYPE % NumberOfNodes
155 mynodeindexes => mycurrentelement % NodeIndexes
156 IF( myverbosity > 3)
THEN
157 WRITE(*,*)
'Node index = ', mynodeindexes(nt)
159 nodepresent = .false.
161 IF (tempnodelist(nk) == mynodeindexes(nt))
THEN
166 IF ( nodepresent .eqv. .false. )
THEN
167 counter = counter + 1
168 IF( myverbosity > 4)
THEN
169 WRITE(*,*)
'counter = ', counter
171 tempnodelist(counter) = mynodeindexes(nt)
177 IF( myverbosity > 5)
THEN
178 WRITE(*,*)
'SIZE(TempNodeList) =',
SIZE(tempnodelist)
179 DO t = 1,
SIZE(tempnodelist)
180 WRITE(*,*) tempnodelist(t)
184 global%nNodes = counter
186 IF( myverbosity > 4)
THEN
187 WRITE(*,*)
'global%nElem = ',global%nElem
188 WRITE(*,*)
'global%nNodes = ',global%nNodes
193 IF( myverbosity > 3)
WRITE(*,*)
'global%nNodes =', global%nNodes
194 ALLOCATE(global%NodeDisplacements(3*global%nNodes))
196 ALLOCATE(global%PreviousNodeDisplacements(3*global%nNodes))
197 global%PreviousNodeDisplacements = 0.d0
198 ALLOCATE(global%IsLoadFreeNode(global%nNodes))
199 global%IsLoadFreeNode = .false.
201 ALLOCATE(global%MyToElmerNodes(global%nNodes))
202 IF( myverbosity > 3)
THEN
203 WRITE(*,*)
'SIZE(NodeDisplacements)=',
SIZE(global%NodeDisplacements)
205 ALLOCATE(currentmodel%ElmerToMyNodes(currentmodel % NumberOfNodes))
206 global%MyToElmerNodes = -1
207 currentmodel%ElmerToMyNodes = -1
211 ALLOCATE(global%FaceLoads(3*global%nElem))
214 ALLOCATE(global%FacePressures(global%nElem))
217 ALLOCATE(global%NodePressures(global%nNodes))
220 ALLOCATE(global%NodeLoads(3*global%nNodes))
223 ALLOCATE(global%PreviousLoads(3,global%nNodes))
225 ALLOCATE(currentmodel%NodeLoadsPass(3,global%nNodes))
226 IF( myverbosity > 3)
WRITE(*,*)
'SIZE(NodeLoads)=',
SIZE(global%NodeLoads)
228 DO t = 1, global%nNodes
231 currentmodel%NodeLoadsPass(j,t) = 0.0
232 global%PreviousLoads(j,t) = 0.0
237 mycurrentelement => mymesh % Elements(lastfsielement)
238 IF (mycurrentelement % TYPE % DIMENSION == 1)
THEN
239 IF (mycurrentelement % TYPE % NumberOfNodes == 2)
THEN
240 global%MeshType =
':b2:'
242 ELSE IF (mycurrentelement % TYPE % NumberOfNodes == 3)
THEN
243 global%MeshType =
':b3:'
246 CALL fatal(
' ',
'FSI elements of 1 dimension must have 2 or 3 nodes!' )
248 ELSE IF (mycurrentelement % TYPE % DIMENSION == 2)
THEN
249 IF( myverbosity > 3)
THEN
250 WRITE(*,*)
'FSI BC element NumberOfNodes =',&
251 mycurrentelement % TYPE % NumberOfNodes
253 IF (mycurrentelement % TYPE % NumberOfNodes == 3)
THEN
254 global%MeshType =
':t3:'
256 ELSE IF (mycurrentelement % TYPE % NumberOfNodes == 6)
THEN
257 global%MeshType =
':t6:'
259 ELSE IF (mycurrentelement % TYPE % NumberOfNodes == 4)
THEN
260 global%MeshType =
':q4:'
262 ELSE IF (mycurrentelement % TYPE % NumberOfNodes == 8)
THEN
263 global%MeshType =
':q8:'
266 CALL fatal(
' ',
'FSI elements of 2 dimensions must have 3 or 6 node&
267 triangles or 4 or 8 node quadrilaterals!' )
270 CALL fatal(
' ',
'FSI elements cannot have dimension greater than 2!' )
273 IF( myverbosity > 3)
THEN
274 WRITE(*,*)
'global%MeshType = ',global%MeshType
275 WRITE(*,*)
'global%nConn =',global%nConn
277 ALLOCATE(global%Conn(global%nConn*global%nElem))
278 ALLOCATE(global%Coords(3*global%nNodes))
283 DO t = mymesh % NumberOfBulkElements+1, &
284 mymesh % NumberOfBulkElements + &
285 mymesh % NumberOfBoundaryElements
289 mycurrentelement => mymesh % Elements(t)
290 bc_id = getbcid(mycurrentelement)
293 CALL getelementnodes(elementnodes,mycurrentelement)
301 IF ( bc_id == global%FSIbcId )
THEN
302 counter = counter + 1
303 IF( myverbosity > 3)
THEN
304 WRITE(*,*)
'element = ',t
306 CALL getelementnodes(elementnodes,mycurrentelement)
308 global%FacePressures(counter) = 0.0
309 global%FaceLoads(3*(counter-1) + 1) = 0.0
310 global%FaceLoads(3*(counter-1) + 1) = 0.0
311 global%FaceLoads(3*(counter-1) + 1) = 0.0
313 DO nt = 1,mycurrentelement % TYPE % NumberOfNodes
314 mynodeindexes => mycurrentelement % NodeIndexes
316 IF( myverbosity > 3)
THEN
317 WRITE(*,*)
'Node index = ', mynodeindexes(nt)
318 WRITE(*,*) elementnodes % x(nt), elementnodes % y(nt), &
322 DO nk=1,global%nNodes
323 IF (tempnodelist(nk) == mynodeindexes(nt))
THEN
330 global%MyToElmerNodes(nindex) = mynodeindexes(nt)
331 currentmodel%ElmerToMyNodes(mynodeindexes(nt)) = nindex
332 global%Conn(global%nConn*(counter-1) + nt) = nindex
333 global%Coords(3*(nindex-1) + 1) = elementnodes % x(nt)
334 global%Coords(3*(nindex-1) + 2) = elementnodes % y(nt)
335 global%Coords(3*(nindex-1) + 3) = elementnodes % z(nt)
336 global%NodeLoads(3*(nindex-1) + 1) = 0.0
337 global%NodeLoads(3*(nindex-1) + 2) = 0.0
338 global%NodeLoads(3*(nindex-1) + 3) = 0.0
339 global%NodePressures(nindex) = 0.0
341 IF (abs(elementnodes % x(nt) - 0.6) < 10.0*epsilon(1.0))
THEN
353 IF( myverbosity >= 5)
THEN
354 WRITE(6,*)
'global%MyToElmerNodes = '
356 WRITE(6,*) i,
' = ',global%MyToElmerNodes(i)
358 WRITE(6,*)
'CurrentModel%ElmerToMyNodes = '
359 DO i=1,currentmodel % NumberOfNodes
360 WRITE(6,*) i,
' = ',currentmodel%ElmerToMyNodes(i)
363 WRITE(6,*)
'-------------------------------------------'
364 WRITE(*,*)
'global%Conn = '
365 WRITE(6,*)
'-------------------------------------------'
366 DO t = 1, global%nElem
367 WRITE(*,*) t,
':',global%Conn(global%nConn*(t-1) + 1),&
368 global%Conn(global%nConn*(t-1) + 2)
373 WRITE(6,*)
'-------------------------------------------'
374 WRITE(*,*)
'global%Coords = '
375 WRITE(6,*)
'-------------------------------------------'
376 DO t = 1, global%nNodes
377 WRITE(*,*) t,
':',global%Coords(3*(t-1)+1),global%Coords(3*(t-1)+2),&
378 global%Coords(3*(t-1)+3)
385 IF( myverbosity > 3)
THEN
386 WRITE(*,*)
'window.mesh = ', &
387 trim(global%window_name)//
'.'//trim(global%MeshType)
389 CALL com_set_size(trim(global%window_name)//
'.nc',11,global%nNodes)
390 CALL com_set_array(trim(global%window_name)//
'.nc',11,global%Coords,3)
391 CALL com_set_size(trim(global%window_name)//
'.'//trim(global%MeshType),11,&
393 CALL com_set_array(trim(global%window_name)//
'.'//trim(global%MeshType),11,&
394 global%Conn, global%nConn)
402 CALL com_new_dataitem(trim(global%window_name)//
'.Displacements',
'n', com_double_precision, 3,
'm')
403 CALL com_set_array(trim(global%window_name)//
'.Displacements',11,&
404 global%NodeDisplacements,3)
408 CALL com_new_dataitem(trim(global%window_name)//
'.PreviousDisplacements',
'n', com_double_precision, 3,
'm')
409 CALL com_set_array(trim(global%window_name)//
'.PreviousDisplacements',11,&
410 global%PreviousNodeDisplacements,3)
414 CALL com_new_dataitem(trim(global%window_name)//
'.Loads',
'n', com_double_precision, 3,
'')
415 CALL com_set_array(trim(global%window_name)//
'.Loads',11,&
419 CALL com_new_dataitem(trim(global%window_name)//
'.NodePressures',&
420 'n', com_double_precision, 1,
'')
421 CALL com_set_array(trim(global%window_name)//
'.NodePressures',11,&
422 global%NodePressures,1)
425 CALL com_new_dataitem(trim(global%window_name)//
'.Pressures',
'e',&
426 com_double_precision, 1,
'')
427 CALL com_set_array(trim(global%window_name)//
'.Pressures',11,&
428 global%FacePressures,1)
431 CALL com_new_dataitem(trim(global%window_name)//
'.FaceLoads',
'e',&
432 com_double_precision, 3,
'')
433 CALL com_set_array(trim(global%window_name)//
'.FaceLoads',11,&
444 IF( myverbosity > 4)
THEN
445 WRITE(6,*)
'-------------------------------------------'
446 WRITE(*,*)
'global%NodeDisplacements = '
447 WRITE(6,*)
'-------------------------------------------'
448 DO i = 1,global%nNodes
450 global%NodeDisplacements(3*(i-1) + j) = 0.0
452 WRITE(6,*) (global%NodeDisplacements(3*(i-1) + j),j=1,3)
459 WRITE(6,*)
'ElmerCSC:Initializer: Done.....'
461 nullify(tempnodelist)
467 SUBROUTINE run(global, runs, tFinal)
479 DOUBLE PRECISION,
INTENT(IN) :: tfinal
480 DOUBLE PRECISION :: standardtimestep
481 DOUBLE PRECISION :: var1, var2, var3
482 DOUBLE PRECISION :: deltatime
496 DOUBLE PRECISION :: tfinal
501 currentmodel => global%MyModel
505 IF (previoustime >= finaltime)
THEN
506 CALL fatal(
' ',
'Next time step passed to RUN is greater than &
507 previous time step!')
510 IF (myverbosity > 3)
WRITE(*,*)
'In RUN function'
512 standardtimestep = timestepsizes(1,1)
513 deltatime = tfinal - stime(1)
514 timesteps(1) = floor(deltatime/standardtimestep)
516 IF (myverbosity > 3)
THEN
517 WRITE(*,*)
'tFinal = ', tfinal
518 WRITE(*,*)
'sTime(1) = ', stime(1)
519 WRITE(*,*)
'standardTimestep = ', standardtimestep
522 var3 = deltatime - int(deltatime/standardtimestep)*standardtimestep
524 IF ( abs(var3) < 1.0d-12 )
THEN
526 IF (myverbosity > 3)
WRITE(*,*)
'standardTimestep evenly divides time'
528 timestepsizes(2,1) = deltatime - timesteps(1)*standardtimestep
531 IF (outputintervals(1) == 1)
THEN
532 outputintervals(2) = 1
534 IF (myverbosity > 3)
THEN
535 WRITE(*,*)
'Remainder for time'
536 WRITE(*,*)
'TimestepSizes(2,1) = ', timestepsizes(2,1)
540 IF (myverbosity > 3)
THEN
541 WRITE(*,*)
'In Run function'
542 WRITE(*,*)
'tFinal = ', tfinal
543 WRITE(*,*)
'sTime(1) = ', stime(1)
544 WRITE(*,*)
'Timesteps(1) = ', timesteps(1)
545 WRITE(*,*)
'standardTimestep = ', standardtimestep
547 WRITE(*,*)
'Pressures '
548 DO t = 1, global%nElem
549 WRITE(*,*) global%FacePressures(t)
552 WRITE(*,*)
'FaceLoads '
553 DO t = 1, global%nElem
554 WRITE(*,*) global%FaceLoads(3*(t-1) + 1), global%FaceLoads(3*(t-1) + 2),&
555 global%FaceLoads(3*(t-1) + 3)
558 WRITE(*,*)
'NodePressures '
559 DO t = 1, global%nNodes
560 WRITE(*,*) global%NodePressures(t)
570 IF (myverbosity > 3)
WRITE(*,*)
'Calling TimeStepper'
572 IF (myverbosity > 3)
WRITE(*,*)
'Done with TimeStepper'
574 IF (global%FSIbcId /= -1)
THEN
575 IF (myverbosity > 3)
WRITE(*,*)
'Calling UpdateDisplacements'
581 DO t = 1, global%nNodes
583 global%PreviousLoads(j,t) = global%NodeLoads(3*(t-1) + j)
589 previoustime = finaltime
591 WRITE(*,*)
'ElmerCSC:Run: runs = ',runs
592 WRITE(*,*)
'ElmerCSC:Run: CurrentModel%GetTestLoads = ',&
593 currentmodel%GetTestLoads
594 WRITE(*,*)
'ElmerCSC:Run: CurrentModel%UDFUsed = ',&
596 IF (runs == 1 .AND. currentmodel%GetTestLoads .eqv. .true. &
597 .AND. currentmodel%UDFUsed .eqv. .true.)
THEN
616 DOUBLE PRECISION :: tfinal
617 INTEGER :: ncount, counter, ncountmax
619 WRITE(*,*)
'ElmerCSC:UpdateDisplacements:',&
620 ' Reporting displacements to the fluid solver'
623 solver => currentmodel % Solvers(global%SolverId)
626 stresssol => solver % Variable
627 displacement => stresssol % Values
628 myperm => stresssol % Perm
630 IF( myverbosity > 3)
THEN
631 WRITE(*,*)
'The SIZE(Displacement) = ',
SIZE(displacement)
632 WRITE(*,*)
'After SolverActivate Call, Displacement(1) = ',&
634 DO t=1,
SIZE(displacement)
635 WRITE(*,*)
'Displacement',t,
'=',displacement(t)
640 elementcount = getnofactive()
641 boundaryelementcount = getnofboundaryelements()
643 mymesh => currentmodel % Meshes
650 IF( myverbosity > 3)
THEN
651 WRITE(*,*)
'Number of bulk elements = ', mymesh % NumberOfBulkElements
652 WRITE(*,*)
'Number of boundary elements = ', mymesh % NumberOfBoundaryElements
654 DO t = mymesh % NumberOfBulkElements+1, &
655 mymesh % NumberOfBulkElements + &
656 mymesh % NumberOfBoundaryElements
657 mycurrentelement => mymesh % Elements(t)
658 bc_id = getbcid(mycurrentelement)
659 IF ( bc_id == global%FSIbcId )
THEN
661 IF( myverbosity > 3)
THEN
662 WRITE(*,*)
'*************************************'
663 WRITE(*,*)
'element ',counter,
'on FSI boundary'
664 WRITE(*,*)
'Update t = ',t,
' bc_id = ',bc_id
666 WRITE(*,*)
'Element no. of nodes:', &
667 mycurrentelement % TYPE % NumberOfNodes
670 CALL getelementnodes(elementnodes,mycurrentelement)
672 DO nt = 1,mycurrentelement % TYPE % NumberOfNodes
673 mynodeindexes => mycurrentelement % NodeIndexes
675 IF( myverbosity > 3)
THEN
676 WRITE(*,*)
'*********************'
677 WRITE(*,*)
'Node index = ', mynodeindexes(nt)
678 WRITE(*,*) elementnodes % x(nt), elementnodes % y(nt), &
680 WRITE(*,*)
'MyPerm = ', myperm(mynodeindexes(nt))
683 IF ( myperm(mynodeindexes(nt)) > 0 )
THEN
684 nk = (stresssol % DOFs)*(myperm(mynodeindexes(nt)) - 1)
685 IF( myverbosity > 3)
WRITE(*,*)
'DOFs = ', stresssol % DOFs
687 ncount = currentmodel%ElmerToMyNodes(mynodeindexes(nt))
692 IF ( ncount > ncountmax )
THEN
693 IF( myverbosity > 3)
THEN
694 WRITE(6,*)
'Updating NodeDisplacement(',ncount,
')'
697 IF ( stresssol % DOFs == 1 )
THEN
698 IF( myverbosity > 3)
WRITE(*,*) displacement(nk+1), 0.0, 0.0
699 global%NodeDisplacements(3*(ncount-1) + 1) = displacement(nk+1)
700 global%NodeDisplacements(3*(ncount-1) + 2) = 0.0d0
701 global%NodeDisplacements(3*(ncount-1) + 3) = 0.0d0
702 ELSE IF ( stresssol % DOFs == 2 )
THEN
703 IF( myverbosity > 3)
WRITE(*,*) displacement(nk+1), displacement(nk+2)
704 global%NodeDisplacements(3*(ncount-1) + 1) = displacement(nk+1)
705 global%NodeDisplacements(3*(ncount-1) + 2) = displacement(nk+2)
706 global%NodeDisplacements(3*(ncount-1) + 3) = 0.0d0
707 ELSE IF ( stresssol % DOFs == 3 )
THEN
724 global%NodeDisplacements(3*(ncount-1) + 1) = displacement(nk+1)&
725 - global%PreviousNodeDisplacements(3*(ncount-1) + 1)
726 global%NodeDisplacements(3*(ncount-1) + 2) = displacement(nk+2)&
727 - global%PreviousNodeDisplacements(3*(ncount-1) + 2)
728 global%NodeDisplacements(3*(ncount-1) + 3) = displacement(nk+3)&
729 - global%PreviousNodeDisplacements(3*(ncount-1) + 3)
732 global%PreviousNodeDisplacements(3*(ncount-1) + 1) = displacement(nk+1)
733 global%PreviousNodeDisplacements(3*(ncount-1) + 2) = displacement(nk+2)
734 global%PreviousNodeDisplacements(3*(ncount-1) + 3) = displacement(nk+3)
742 WRITE(*,*)
'StressSol % DOFs = ', stresssol % DOFs
743 WRITE(*,*)
'DOFs are assumed to be <= 3'
744 CALL fatal(
' ',
'StressSol DOFs are greater than 3 ' )
746 ncountmax = max(ncount, ncountmax)
798 IF( myverbosity > 50)
THEN
799 WRITE(6,*)
'tFinal = ', tfinal
800 WRITE(6,*)
'NodeDisplacements'
801 DO i = 1,global%nNodes
802 WRITE(6,*) (global%NodeDisplacements(3*(i-1) + j),j=1,3)
804 WRITE(6,*)
'Exiting UpdateDisplacements'
828 CHARACTER(LEN=MAX_NAME_LEN) :: datestr, toutput
830 currentmodel => global%MyModel
832 WRITE(*,*)
'ElmerCSC:Finalize: Finishing simulation'
836 CALL envir(
'ELMERSOLVER_OUTPUT_TOTAL'//char(0), toutput, tlen )
837 silent = toutput(1:1)==
'0' .OR. toutput(1:5)==
'false'
839 IF ( .NOT. silent )
THEN
840 IF ( parenv % myPE == 0 )
THEN
843 datestr = formatdate()
844 WRITE( *,
'(A,A)' )
'ELMER SOLVER FINISHED AT: ', trim(datestr)
848 WRITE(6,*)
'ElmerCSC:Finalize: End Finalize. FirstTime = ',firsttime
863 SUBROUTINE com_set_pointer(attr,ptr,asso)
865 CHARACTER(*),
INTENT(IN) :: attr
868 END SUBROUTINE com_set_pointer
873 INTEGER :: runs, verbin
876 SUBROUTINE run(global, runs, tFinal)
880 DOUBLE PRECISION,
INTENT(IN) :: tfinal
887 DOUBLE PRECISION :: tfinal
898 CHARACTER(*),
intent(in) :: name
899 INTEGER :: com_types(7)
903 WRITE(*,
'(A)')
"Loading ElmerCSC: "//trim(name)
907 glb%window_name = trim(name)
908 glb%other_window_handle = -1
909 glb%c_window_handle = -1
910 CALL com_new_window(trim(name))
912 CALL com_new_dataitem(trim(name)//
'.global',
'w',com_f90pointer,1,
'')
913 CALL com_allocate_array(trim(name)//
'.global')
915 com_types(1) = com_f90pointer
916 com_types(2) = com_integer
917 com_types(3) = com_integer
919 CALL com_set_member_function(trim(name)//
'.Initialize',
initializer, &
920 trim(name)//
'.global',
'bbi',com_types)
922 com_types(3) = com_double_precision
924 CALL com_set_member_function(trim(name)//
'.Run',
run, &
925 trim(name)//
'.global',
'bbi',com_types)
927 CALL com_set_member_function(trim(name)//
'.Finalize',
finalize, &
928 trim(name)//
'.global',
'bb',com_types)
930 CALL com_window_init_done(name)
942 SUBROUTINE com_get_pointer(attr,ptr,asso)
944 CHARACTER(*),
INTENT(IN) :: attr
947 END SUBROUTINE com_get_pointer
949 character(*),
intent(in) :: name
951 INTEGER :: window_handle,other_window_handle,c_window_handle, owlen
953 WRITE(*,
'(A)')
"Unloading ElmerCSC: "//trim(name)
955 window_handle = com_get_window_handle(trim(name))
956 if(window_handle .gt. 0)
then
958 IF(
ASSOCIATED(glb).eqv..true.)
THEN
959 WRITE(*,
'(A)')
'Fortran module '//trim(glb%window_name)//
' unloading name '//trim(name)
960 if(glb%other_window_handle .gt. 0)
then
961 WRITE(*,*)
'Fortran module '//trim(glb%window_name)//&
962 ' unloading external Fortran module '//trim(glb%other_window_name)//
'.'
963 other_window_handle = com_get_window_handle(trim(glb%other_window_name))
964 IF(other_window_handle .gt. 0)
THEN
965 CALL com_unload_module(
"ElmerCSC",trim(glb%other_window_name))
968 if(glb%c_window_handle .gt. 0)
then
969 WRITE(*,*)
'Fortran module '//trim(glb%window_name)//&
970 ' unloading external C module '//trim(glb%c_window_name)//
'.'
971 c_window_handle = com_get_window_handle(trim(glb%c_window_name))
972 IF(c_window_handle .gt. 0)
THEN
973 CALL com_unload_module(
"ElmerCSC",trim(glb%c_window_name))
978 CALL com_delete_window(trim(name))
ElmerLib Elmer library routines
subroutine timestepper(global, runs)
subroutine elmerfinalize(runs)
ElmerLib Elmer library routines
subroutine finalize(global, runs)
subroutine elmerinitialize(runs)
ElmerLib Elmer library routines
subroutine elmercsc_load_module(name)
subroutine updatedisplacements(global, runs, tFinal)
subroutine associate_pointer(attr, ptr)
ElmerLib Elmer library routines
subroutine initializer(global, runs, verbIn)
A caller for the Elmer main program.
subroutine elmercsc_unload_module(name)
subroutine run(global, runs, tFinal)