KTH framework for Nek5000 toolboxes; testing version  0.0.1
map2D.f
Go to the documentation of this file.
1 
8 !=======================================================================
12  subroutine map2d_register()
13  implicit none
14 
15  include 'SIZE'
16  include 'INPUT'
17  include 'FRAMELP'
18  include 'MAP2D'
19 
20 ! local variables
21  integer lpmid, il
22  real ltim
23  character*2 str
24 
25 ! functions
26  real dnekclock
27 !-----------------------------------------------------------------------
28 ! timing
29  ltim = dnekclock()
30 
31 ! check if the current module was already registered
32  call mntr_mod_is_name_reg(lpmid,map2d_name)
33  if (lpmid.gt.0) then
34  call mntr_warn(lpmid,
35  $ 'module ['//trim(map2d_name)//'] already registered')
36  return
37  endif
38 
39 ! find parent module
40  call mntr_mod_is_name_reg(lpmid,'FRAME')
41  if (lpmid.le.0) then
42  lpmid = 1
43  call mntr_abort(lpmid,
44  $ 'parent module ['//'FRAME'//'] not registered')
45  endif
46 
47 ! register module
48  call mntr_mod_reg(map2d_id,lpmid,map2d_name,
49  $ 'Mapping 3D mesh to 2D section')
50 
51 ! register timer
52  call mntr_tmr_is_name_reg(lpmid,'FRM_TOT')
53  call mntr_tmr_reg(map2d_tmr_id,lpmid,map2d_id,
54  $ 'MAP2D_TOT','2D mapping total time',.false.)
55 
56 ! set initialisation flag
57  map2d_ifinit=.false.
58 
59 ! timing
60  ltim = dnekclock() - ltim
61  call mntr_tmr_add(map2d_tmr_id,1,ltim)
62 
63  return
64  end subroutine
65 !=======================================================================
69  subroutine map2d_init()
70  implicit none
71 
72  include 'SIZE'
73  include 'INPUT'
74  include 'GEOM'
75  include 'FRAMELP'
76  include 'MAP2D'
77 
78 ! local variables
79  integer itmp
80  real rtmp, ltim
81  logical ltmp
82  character*20 ctmp
83 
84  integer il, jl
85 
86 ! functions
87  real dnekclock
88 !-----------------------------------------------------------------------
89 ! timing
90  ltim = dnekclock()
91 
92 ! check if the module was already initialised
93  if (map2d_ifinit) then
94  call mntr_warn(map2d_id,
95  $ 'module ['//trim(map2d_name)//'] already initiaised.')
96  return
97  endif
98 
99  call map2d_get
100 
101 ! reshuffle coordinate arrays
102  call mntr_log(map2d_id,lp_vrb,'Creating 2D mesh')
103  call map2d_init_coord
104 
105 ! everything is initialised
106  map2d_ifinit=.true.
107 
108 ! timing
109  ltim = dnekclock() - ltim
110  call mntr_tmr_add(map2d_tmr_id,1,ltim)
111 
112  return
113  end subroutine
114 !=======================================================================
119  subroutine map2d_get()
120  implicit none
121 
122  include 'SIZE'
123  include 'FRAMELP'
124  include 'MAP2D' ! 2D mapping speciffic variables
125 
126 ! work arrays
127  integer lctrs1 ,lctrs2 ! array sizes
128  parameter(lctrs1=3,lctrs2=2*lx1*ly1*lz1*lelt)
129  real ctrs(lctrs1,lctrs2) ! 2D element centres for sorting
130  integer cell(lctrs2) ! local element numberring
131  integer ninseg(lctrs2) ! elements in segment
132  integer ind(lctrs2) ! sorting index
133  integer owner(lctrs2) ! mark node with smallest id
134  logical ifseg(lctrs2) ! segment borders
135  common /scrns/ ctrs
136  common /scrvh/ ifseg
137  common /scruz/ cell, ninseg, ind, owner
138 
139  integer nelsort ! number of local 3D elements to sort
140  integer nseg ! segments number
141  integer il, jl, iseg ! loop index
142  integer ierr ! error flag
143 
144  real ltol ! tolerance for detection of section borders
145  parameter(ltol = 1.0e-4)
146 
147 ! simple timing
148  real ltim
149 
150 ! functions
151  integer iglsum, iglmin, iglmax
152  real dnekclock
153 
154 !#define DEBUG
155 #ifdef DEBUG
156 ! for testing
157  character*3 str1, str2
158  integer iunit
159  ! call number
160  integer icalldl
161  save icalldl
162  data icalldl /0/
163 #endif
164 !-----------------------------------------------------------------------
165 ! simple timing
166  ltim = dnekclock()
167 
168 ! stamp logs
169  call mntr_log(map2d_id,lp_inf,'3D=>2D mapping begin')
170 
171 
172  call mntr_log(map2d_id,lp_vrb,'Local 3D=>2D mapping')
173 
174 ! fill in arrays using user interface
175 ! We can sort only part of the domain, so first mark and copy
176 ! all elements in the region you are interested in
177 ! set uniform direction, cell centres and diagonals
178  call user_map2d_get(map2d_idir,ctrs,cell,lctrs1,lctrs2,nelsort,
179  $ map2d_xm1,map2d_ym1,ierr)
180 
181  call mntr_check_abort(map2d_id,ierr,'Wrong element shape')
182 
183  if (map2d_idir.gt.ldim) call mntr_abort(map2d_id,
184  $ 'Wrong mapping direction')
185 
186 ! check array sizes vs number of elements for sorting
187  if (lctrs2.lt.nelsort) then
188  ierr = 1
189  else
190  ierr = 0
191  endif
192  call mntr_check_abort(map2d_id,ierr,'Too many element to sort')
193 
194  if (nelt.lt.nelsort) then
195  ierr = 1
196  else
197  ierr = 0
198  endif
199  call mntr_check_abort(map2d_id,ierr,
200  $ 'More element to sort than local elements')
201 
202 ! local sort to get unique 2D elements
203  call map2d_get_local(ctrs,cell,ninseg,ind,ifseg,
204  $ lctrs1,lctrs2,nseg,nelsort,ltol)
205 
206 ! generate local 3D => 2D mapping
207 ! local number of unique 2D elements
208  map2d_lnum = nseg
209 
210 ! mark all elements as unwanted
211  call ifill(map2d_lmap,-1,nelt)
212 
213 ! for all segments count 3D elements
214  jl=1
215  do iseg=1,nseg
216 ! within segment
217  do il=1,ninseg(iseg)
218  map2d_lmap(cell(jl)) = iseg
219  jl=jl+1
220  enddo
221  enddo
222 
223 #ifdef DEBUG
224 ! testing
225  icalldl = icalldl+1
226  call io_file_freeid(iunit, ierr)
227  write(str1,'(i3.3)') nid
228  write(str2,'(i3.3)') icalldl
229  open(unit=iunit,file='map2d_loc.txt'//str1//'i'//str2)
230 
231  write(iunit,*) nseg, nelv
232  write(iunit,*) 'Coordinates'
233  do il=1,nseg
234  write(iunit,*) il, ctrs(:,il)
235  enddo
236  write(iunit,*) 'Mapping'
237  do il=1,nelv
238  write(iunit,*) il, map2d_lmap(il)
239  enddo
240  close(iunit)
241 #endif
242 
243  call mntr_log(map2d_id,lp_vrb,'Global 3D=>2D mapping')
244 
245 ! reset ownership and local => global map
246 ! this routine will produce the simplest ownership without
247 ! taking into account work ballancing
248  call ifill(map2d_gmap,-1,nseg)
249  call ifill(map2d_own,-1,nseg)
250 
251  call map2d_get_global(ctrs,owner,cell,ninseg,ind,ifseg,
252  $ lctrs1,lctrs2,nseg,ltol)
253 
254 ! find number of of elements owned
255  map2d_lown = 0
256  do il=1,map2d_lnum
257  if (map2d_own(il).eq.nid) map2d_lown = map2d_lown + 1
258  enddo
259 ! global number of unique 2D elements
260  map2d_gnum = iglsum(map2d_lown,1)
261 ! imbalance
262  il = iglmin(map2d_lown,1)
263  jl = iglmax(map2d_lown,1)
264 
265 ! stamp logs
266  call mntr_logi(map2d_id,lp_inf,
267  $ 'Global number of unique 2D elements: ',map2d_gnum)
268  call mntr_log(map2d_id,lp_vrb,'Owned 2D element imbalance:')
269  call mntr_logi(map2d_id,lp_vrb,' min: ',il)
270  call mntr_logi(map2d_id,lp_vrb,' max: ',jl)
271 
272 #ifdef DEBUG
273 ! testing
274  call io_file_freeid(iunit, ierr)
275  write(str1,'(i3.3)') nid
276  write(str2,'(i3.3)') icalldl
277  open(unit=iunit,file='map2d_glob.txt'//str1//'i'//str2)
278 
279  write(iunit,*) map2d_gnum, map2d_lown
280  write(iunit,*) 'Mapping'
281  do il=1,map2d_lnum
282  write(iunit,*) il, map2d_gmap(il),map2d_own(il)
283  enddo
284  close(iunit)
285 #endif
286 #undef DEBUG
287 
288 ! stamp logs
289  call mntr_log(map2d_id,lp_inf,'3D=>2D mapping end')
290 
291 ! timing
292  ltim = dnekclock() - ltim
293  call mntr_tmr_add(map2d_tmr_id,1,ltim)
294 
295  return
296  end subroutine
297 !=======================================================================
309  subroutine map2d_get_local(ctrs,cell,ninseg,ind,ifseg,
310  $ lctrs1,lctrs2,nseg,nelsort,tol)
311  implicit none
312 
313  include 'SIZE'
314 
315 ! argument list
316  integer lctrs1,lctrs2 ! array sizes
317  real ctrs(lctrs1,lctrs2) ! 2D element centres for sorting
318  integer nseg ! segments number
319  integer nelsort ! number of local 3D elements to sort
320  real tol ! tolerance to find segment borders
321 ! work arrays
322  integer cell(lctrs2) ! local element numberring
323  integer ninseg(lctrs2) ! elements in segment
324  integer ind(lctrs2) ! sorting index
325  logical ifseg(lctrs2) ! segment borders
326 
327 ! local variables
328  integer el, il, jl ! loop indexes
329  integer ierr ! error flag
330 
331 ! local sorting
332  integer key ! sorting key
333  integer ipass, iseg ! loop index
334  real aa(lctrs1) ! dummy array
335 !-----------------------------------------------------------------------
336 ! for every element
337  do el=1,nelsort
338 ! reset segments borders
339  ifseg(el) = .false.
340  enddo
341 
342 ! perform local sorting to identify unique set sorting by directions
343 ! first run => whole set is one segment
344  nseg = 1
345  ifseg(1) = .true.
346  ninseg(1) = nelsort
347 
348 ! Multiple passes eliminates false positives
349  do ipass=1,2
350  do jl=1,ldim-1 ! Sort within each segment (dimention)
351 
352  il=1
353  do iseg=1,nseg
354  call tuple_sort(ctrs(1,il),lctrs1,ninseg(iseg),jl,1,
355  $ ind,aa) ! key = jl
356  call iswap_ip(cell(il),ind,ninseg(iseg)) ! Swap position
357  il = il + ninseg(iseg)
358  enddo
359 
360  do il=2,nelsort
361 ! find segments borders
362  if (abs(ctrs(jl,il)-ctrs(jl,il-1)).gt.
363  $ tol*min(ctrs(3,il),ctrs(3,il-1)))
364  $ ifseg(il)=.true.
365  enddo
366 
367 ! Count up number of different segments
368  nseg = 0
369  do il=1,nelsort
370  if (ifseg(il)) then
371  nseg = nseg+1
372  ninseg(nseg) = 1
373  else
374  ninseg(nseg) = ninseg(nseg) + 1
375  endif
376  enddo
377  enddo ! jl=1,2
378  enddo ! ipass=1,2
379 ! sorting end
380 
381 ! contract coordinate set
382 ! for all segments
383 ! count 3D elements
384  jl=ninseg(1) +1
385  do iseg=2,nseg
386  do il = 1,lctrs1
387  ctrs(il,iseg) = ctrs(il,jl)
388  enddo
389  jl = jl + ninseg(iseg)
390  enddo
391 
392  return
393  end subroutine
394 !=======================================================================
406  subroutine map2d_get_global(ctrs,owner,cell,ninseg,ind,ifseg,
407  $ lctrs1,lctrs2,nseg,tol)
408  implicit none
409 
410  include 'SIZE'
411  include 'PARALLEL'
412  include 'FRAMELP'
413  include 'MAP2D'
414 
415 ! argument list
416  integer lctrs1,lctrs2 ! array sizes
417  real ctrs(lctrs1,lctrs2) ! 2D element centres for sorting
418  integer nseg ! segments number
419  real tol ! tolerance to find segment borders
420 ! work arrays
421  integer owner(lctrs2) ! mark node with smallest id
422  integer cell(lctrs2) ! local element numberring
423  integer ninseg(lctrs2) ! elements in segment
424  integer ind(lctrs2) ! sorting index
425  logical ifseg(lctrs2) ! segment borders
426 
427 ! local variables
428  integer lnseg ! initia number of segments
429  integer csteps ! numer of steps in the cycle
430  integer lwork ! working array size
431  integer umrkgl ! global number of unmarked zones
432 ! local coppies
433  real lctrs(lctrs1,LELT) ! local copy 2D element centres
434  integer nsort ! number of elements to sort
435  integer nsorted ! number of sorted elements
436 
437  integer igpass ! numer of executed cycles
438  integer igpass_max ! max numer of cycles
439  parameter(igpass_max = 100)
440 
441  integer icstep ! loop index
442 
443 ! communication
444  integer msg_id1, msg_id2 ! message id for non-blocking receive
445  integer srcid, dstid ! source and destination node id
446  integer len ! buffer size
447  integer cnsort ! number of elements to receive
448 
449 ! local sorting
450  integer key ! sorting key
451  integer ipass, iseg, il, jl, kl ! loop index
452  real aa(lctrs1) ! dummy array
453 
454 ! error mark
455  integer ierror
456 
457  character*3 str
458 
459 ! functions
460  integer iglsum, irecv, iglmin, iglmax
461 !-----------------------------------------------------------------------
462 ! make a local copy of initial set
463  lnseg = nseg
464  il = lctrs1*nseg
465  call copy(lctrs,ctrs,il)
466 
467 ! get number of steps to exchange all the data in the ring
468  csteps=int(log(np+0.0)/log(2.0))
469  if(np.gt.2**csteps) csteps=csteps+1
470 
471 ! free array size
472  lwork = lctrs2/2
473 
474 ! get global number of unmarked zones
475  umrkgl = iglsum(nseg,1)
476 ! initial number of elements to sort
477  nsort = min(nseg,lwork)
478 ! initial number of sorted elements
479  nsorted = 0
480 
481 ! fill initial cell and ownership arrays
482  do il=1,nsort
483  cell(il) = il
484  owner(il) = nid
485  enddo
486 
487 ! following loop has to be executed as long as unmarked zones
488 ! exists
489 ! count global passes
490  igpass = 1
491  do
492 
493 ! stamp log
494  write(str,'(i3.3)') igpass
495  call mntr_logi(map2d_id,lp_vrb,
496  $ 'Cycle '//str//'; globally unmarked = ',umrkgl)
497 
498 ! collect information within the ring
499  do icstep=1,csteps
500 
501 ! exchange information between processors
502 ! source and destination
503  il = 2**(icstep-1)
504  srcid = nid - il
505  dstid = nid + il
506  if (srcid.lt.0) srcid = srcid + np
507  if (dstid.ge.np) dstid = dstid - np
508 
509 ! set buffer for the number of elements to receive
510  len = isize
511  msg_id1 = irecv(0,cnsort,len)
512 
513 ! send local size of the buffer
514  call csend(0,nsort,len,dstid,0)
515 
516 ! finish communication
517  call msgwait(msg_id1)
518 
519 ! exchange coordinates and ownership
520 ! receive
521  len = wdsize*lctrs1*cnsort
522  msg_id1 = irecv(1,ctrs(1,nsort+1),len)
523 
524  len = isize*cnsort
525  msg_id2 = irecv(2,owner(nsort+1),len)
526 
527 ! send
528  len = wdsize*lctrs1*nsort
529  call csend(1,ctrs,len,dstid,0)
530 
531  len = isize*nsort
532  call csend(2,owner,len,dstid,0)
533 
534 ! reset cell for the received elements to -1
535 ! this way all the non-local elements are marked
536  do il=nsort + 1,nsort + cnsort
537  cell(il) = -1
538  enddo
539 
540 ! update number of elements to sort
541  nsort = nsort + cnsort
542 
543 ! perform local sorting to identify unique set
544 ! sorting by directions
545 ! reset section boudarry mark
546  do il=1,nsort
547  ifseg(il) = .false.
548  enddo
549 ! first run => whole set is one segment
550  nseg = 1
551  ifseg(1) = .true.
552  ninseg(1) = nsort
553 
554 ! finish communication
555  call msgwait(msg_id1)
556  call msgwait(msg_id2)
557 
558 ! Multiple passes eliminates false positives
559  do ipass=1,2
560  do jl=1,ldim-1 ! Sort within each segment (dimension)
561 
562  il =1
563  do iseg=1,nseg
564  call tuple_sort(ctrs(1,il),lctrs1,ninseg(iseg),
565  $ jl,1, ind,aa) ! key = jl
566 ! Swap position
567  call iswap_ip(cell(il),ind,ninseg(iseg))
568  call iswap_ip(owner(il),ind,ninseg(iseg))
569  il = il + ninseg(iseg)
570  enddo
571 
572  do il=2,nsort
573 ! find segments borders
574  if (abs(ctrs(jl,il)-ctrs(jl,il-1)).gt.
575  $ tol*min(ctrs(3,il),ctrs(3,il-1)))
576  $ ifseg(il)=.true.
577  enddo
578 
579 ! Count up number of different segments
580  nseg = 0
581  do il=1,nsort
582  if (ifseg(il)) then
583  nseg = nseg+1
584  ninseg(nseg) = 1
585  else
586  ninseg(nseg) = ninseg(nseg) + 1
587  endif
588  enddo
589  enddo ! jl=1,2
590  enddo ! ipass=1,2
591 ! local sorting end
592 
593 ! contract coordinate set
594 ! for all segments
595  jl=ninseg(1) +1
596  do iseg=2,nseg
597  do il = 1,lctrs1
598  ctrs(il,iseg) = ctrs(il,jl)
599  enddo
600  jl = jl + ninseg(iseg)
601  enddo
602 ! contract ownership
603 ! for all segments
604  jl=1
605  do iseg=1,nseg
606  owner(iseg) = owner(jl)
607  jl = jl + 1
608 ! within segment
609  do il=2,ninseg(iseg)
610  if (owner(iseg).gt.owner(jl)) owner(iseg) = owner(jl)
611  jl = jl + 1
612  enddo
613  enddo
614 ! contract cell
615  ierror = 0
616 ! for all segments
617  jl=1
618  do iseg=1,nseg
619  cell(iseg) = cell(jl)
620  jl = jl + 1
621 ! within segment
622 ! for checking consistency
623 ! in every section can be only 1 non negative cell entrance
624  kl = 0
625  if (cell(iseg).ne.-1) kl = kl+1
626  do il=2,ninseg(iseg)
627  if (cell(iseg).lt.cell(jl)) cell(iseg) = cell(jl)
628  if (cell(jl).ne.-1) kl = kl+1
629  jl=jl + 1
630  enddo
631  if (kl.gt.1) ierror = ierror +1
632  enddo
633 
634 ! check consistency
635  call mntr_check_abort(map2d_id,ierror,
636  $ 'Too many local elements in section')
637 
638 ! update number of elements to sort
639  nsort = min(nseg,lwork)
640 
641  enddo ! icstep
642 ! global exchange and sort end
643 
644  ierror = 0
645 ! mark elements that can be mapped
646  do il=1,nsort
647  if (cell(il).ne.-1) then
648 ! check consistency; was this cell mapped previously
649  if(map2d_gmap(cell(il)).ne.-1) then
650  ierror = ierror +1
651  endif
652  map2d_gmap(cell(il)) = nsorted + il
653  map2d_own(cell(il)) = owner(il)
654  endif
655  enddo
656 
657 ! check consistency
658  call mntr_check_abort(map2d_id,ierror,
659  $ 'Element already assigned')
660 
661 ! update number of sorted elements
662  nsorted = nsorted + nsort
663 
664 ! count local unmarked zones
665  nseg = 0
666  do il=1,lnseg
667  if(map2d_gmap(il).eq.-1) then
668  nseg = nseg + 1
669 ! fill in coordinates and mark initial ownership
670  if (nseg.le.lwork) then
671  call copy(ctrs(1,nseg),lctrs(1,il),lctrs1)
672  owner(nseg) = nid
673  cell(nseg) = il
674  endif
675  endif
676  enddo
677 
678 ! get global number of unmarked zones
679  umrkgl = iglsum(nseg,1)
680 
681  if (umrkgl.eq.0) exit
682 
683 ! update number of elements to sort
684  nsort = min(nseg,lwork)
685 
686 ! count global passes
687  igpass = igpass +1
688 
689 ! is igpass too big; something is wrong exit
690  if (igpass.gt.igpass_max) then
691  call mntr_abort(map2d_id,'Max iterations exceeded')
692  endif
693 
694  enddo ! infinite loop
695 
696  return
697  end subroutine
698 !=======================================================================
701  subroutine map2d_init_coord
702  implicit none
703 
704  include 'SIZE'
705  include 'MAP2D'
706 
707 ! local variables
708  integer len ! buffer size
709  integer il ! loop index
710  integer el ! destination element
711  integer imark(lelt) ! element mark
712  real rtmp(lx1,lz1,lelt,2) ! dummy arrays
713  common /ctmp0/ rtmp
714 
715 !#define DEBUG
716 #ifdef DEBUG
717 ! for testing
718  character*2 str
719  integer iunit
720 #endif
721 !-----------------------------------------------------------------------
722  len = lx1*lz1
723  call ifill(imark, -1,nelv)
724  do il=1,nelv
725  el = map2d_lmap(il)
726  if (el.gt.0) then
727  if (imark(el).eq.-1) then
728  imark(el) = 1
729  call copy(rtmp(1,1,el,1),map2d_xm1(1,1,il),len)
730  call copy(rtmp(1,1,el,2),map2d_ym1(1,1,il),len)
731  endif
732  endif
733  enddo
734 
735 ! copy arrays back
736  len = len*map2d_lnum
737  call copy(map2d_xm1,rtmp(1,1,1,1),len)
738  call copy(map2d_ym1,rtmp(1,1,1,2),len)
739 
740 #ifdef DEBUG
741 ! testing
742  write(str,'(i2.2)') nid
743  call io_file_freeid(iunit, ierr)
744  open(unit=iunit,file='map2d_init_coord.txt'//str)
745  write(iunit,*) nid, nelv, map2d_idir, map2d_lnum
746  do el=1,nelv
747  write(iunit,*) 'Element ', el
748  do jl=1,nz1
749  do il=1,nx1
750  write(iunit,*) il,jl,map2d_xm1(il,jl,el),
751  $ map2d_ym1(il,jl,el)
752  enddo
753  enddo
754  enddo
755  close(iunit)
756 #endif
757 #undef DEBUG
758  return
759  end subroutine
760 !======================================================================
subroutine msgwait(imsg)
Definition: comm_mpi.f:489
subroutine csend(mtype, buf, len, jnid, jpid)
Definition: comm_mpi.f:303
subroutine io_file_freeid(iunit, ierr)
Get free file unit number and store max unit value.
Definition: io_tools.f:47
subroutine map2d_register()
Register 2D mapping routines.
Definition: map2D.f:13
subroutine map2d_get_global(ctrs, owner, cell, ninseg, ind, ifseg, lctrs1, lctrs2, nseg, tol)
Get global 3D=>2D mapping.
Definition: map2D.f:408
subroutine map2d_init()
Initilise map2d module.
Definition: map2D.f:70
subroutine map2d_get_local(ctrs, cell, ninseg, ind, ifseg, lctrs1, lctrs2, nseg, nelsort, tol)
Get local 3D=>2D mapping.
Definition: map2D.f:311
subroutine map2d_get()
Get 3D to 2D element mapping.
Definition: map2D.f:120
subroutine map2d_init_coord
Generate 2D mesh out of 3D one.
Definition: map2D.f:702
subroutine mntr_logi(mid, priority, logs, ivar)
Write log message adding single integer.
Definition: mntrlog.f:709
subroutine mntr_tmr_is_name_reg(mid, mname)
Check if timer name is registered and return its id.
Definition: mntrtmr.f:146
subroutine mntr_warn(mid, logs)
Write warning message.
Definition: mntrlog.f:803
subroutine mntr_tmr_add(mid, icount, time)
Check if timer id is registered. This operation is performed locally.
Definition: mntrtmr.f:237
subroutine mntr_mod_is_name_reg(mid, mname)
Check if module name is registered and return its id.
Definition: mntrlog.f:459
subroutine mntr_abort(mid, logs)
Abort simulation.
Definition: mntrlog.f:837
subroutine mntr_log(mid, priority, logs)
Write log message.
Definition: mntrlog.f:600
subroutine mntr_mod_reg(mid, pmid, mname, mdscr)
Register new module.
Definition: mntrlog.f:346
subroutine mntr_tmr_reg(mid, pmid, modid, mname, mdscr, ifsum)
Register new timer.
Definition: mntrtmr.f:16
subroutine mntr_check_abort(mid, ierr, logs)
Abort simulation.
Definition: mntrlog.f:856
subroutine ifill(ia, ib, n)
Definition: math.f:252
subroutine copy(a, b, n)
Definition: math.f:260
subroutine iswap_ip(x, p, n)
Definition: math.f:1378
subroutine tuple_sort(a, lda, n, key, nkey, ind, aa)
Definition: navier8.f:389