9 USE v3_utilities,
ONLY:
assert
10 USE descriptor_mod,
ONLY: siesta_comm
13 & setmatrixrowcoll, setmatrixrowcold, setmatrixrowcolu, &
14 & getmatrixrowcoll, getmatrixrowcold, getmatrixrowcolu, &
15 & getmatrixrhs, storediagonal
22 LOGICAL :: SKSDBG=.false.
23 LOGICAL :: KPDBG=.false.
24 LOGICAL :: PARSOLVER=.false.
25 LOGICAL :: SYMMETRYCHECK=.true.
26 LOGICAL :: PARGMRES=.false.
27 LOGICAL :: BUFFERED=.false.
28 LOGICAL :: PARFUNCTISL=.false.
29 LOGICAL :: OUTPUT_TIMINGS=.false.
32 LOGICAL :: INITREMAPDONE=.false.
33 LOGICAL :: MAPPINGDONE=.false.
34 LOGICAL :: FIRSTPARTITION_GE_2=.false.
35 LOGICAL :: LASTPARTITION_GE_2=.false.
36 CHARACTER(50) :: crank, cactiveranks
37 CHARACTER*100 :: envvar
38 CHARACTER*100 :: envval
39 CHARACTER,
ALLOCATABLE :: remapBuffer(:)
42 INTEGER :: OpenStatus, nargs
43 INTEGER,
PRIVATE :: N, M, K, KSQR
44 INTEGER,
PARAMETER :: SAVEDIAG=4, lower=3,diag=2,upper=1
48 INTEGER :: startglobrow, endglobrow, numBlocks
49 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: bcyclicStartBlockProc, bcyclicEndBlockProc
50 INTEGER,
ALLOCATABLE,
DIMENSION (:),
PRIVATE :: tagBlock, tagColInBlock
51 INTEGER,
ALLOCATABLE,
DIMENSION (:),
TARGET :: rcounts, disp
52 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: rcountsNS, dispNS
53 INTEGER,
PRIVATE :: a, b, c, flag, cnt
54 INTEGER,
PRIVATE :: icol, itype, block_row, irow, procID, ierror, localbrow
55 INTEGER :: activeranks, rank, nranks, leftproc, rightproc, totRecvs, nrecd
56 INTEGER :: tag, MPI_ERR, SYSMAXTAG, APPMAXTAG
61 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: mnspcounts, mnspdisps
62 LOGICAL,
PRIVATE :: SetUpTOMNSPAllGatherDONE=.false.
65 INTEGER :: MPI_Status(MPI_STATUS_SIZE)
72 SUBROUTINE myenvvariables
84 output_timings=.false.
96 CALL getenv(envvar,envval)
97 IF (envval.EQ.
'ScaLAPACK' .OR. envval.EQ.
'FALSE')
THEN
101 output_timings=.false.
103 END SUBROUTINE myenvvariables
107 SUBROUTINE setoutputfile (iam, nprocs)
109 INTEGER :: iam, nprocs, istat
110 CHARACTER(100) :: fname, cfname
111 CHARACTER(50) :: ciam, cnprocs
113 WRITE(ciam,*) iam;
WRITE(cnprocs,*) nprocs
114 ciam=adjustl(ciam); cnprocs=adjustl(cnprocs)
117 fname=
'sks-'//trim(ciam)//
'-P-'//trim(cnprocs)//
'.txt'
118 OPEN(unit=tofu, file=fname, status=
"REPLACE", action=
"WRITE",&
119 &form=
"FORMATTED",position=
"APPEND", iostat=istat)
121 WRITE(tofu,*)
'SKSDBG:', sksdbg;
CALL flush(tofu)
122 WRITE(tofu,*)
'KPDBG:', kpdbg;
CALL flush(tofu)
124 WRITE(tofu,*)
'SYMMETRYCHECK:', symmetrycheck;
CALL flush(tofu)
125 WRITE(tofu,*)
'BUFFERED:', buffered;
CALL flush(tofu)
126 WRITE(tofu,*)
'PARGMRES:', pargmres;
CALL flush(tofu)
127 WRITE(tofu,*)
'PARSOLVER:', parsolver;
CALL flush(tofu)
130 END SUBROUTINE setoutputfile
138 SUBROUTINE initremap (mpol_in,ntor_in,blkrownum,numprocs,myrank)
141 INTEGER,
INTENT(IN) :: mpol_in,ntor_in,blkrownum,numprocs,myrank
143 INTEGER :: i, FLAG, tmpint
144 INTEGER*8 :: nBuffSize
148 IF(initremapdone .OR. .NOT.parsolver)
RETURN
150 linblksize=(mpol_in+1)*(2*ntor_in+1)
154 CALL assert(m.NE.0, n.NE.0,
'M, N = 0 IN initRemap')
163 leftproc=mpi_proc_null
166 IF(rank.LT.nranks-1)
THEN
169 rightproc=mpi_proc_null
174 IF (activeranks.GT.n) activeranks=n
177 CALL mpi_pack_size(2,mpi_integer,siesta_comm,length,mpi_err)
178 packsize=packsize+length
179 CALL mpi_pack_size(m,mpi_real8,siesta_comm,length,mpi_err)
180 packsize=packsize+length
184 tmpint=packsize+mpi_bsend_overhead
186 nbuffsize=nbuffsize*4
187 nbuffsize=nbuffsize*m
188 nbuffsize=nbuffsize*n
189 nbuffsize=nbuffsize/max(nranks,1)
190 IF (nbuffsize.LE.0)
THEN
191 CALL mpi_barrier(siesta_comm,mpi_err)
193 WRITE(7000+rank,*)
'>>> N : ', n;
CALL flush(7000+rank)
194 WRITE(7000+rank,*)
'>>> M : ', m;
CALL flush(7000+rank)
195 WRITE(7000+rank,*)
'>>> PACKSIZE : ', packsize;
CALL flush(7000+rank)
196 WRITE(7000+rank,*)
'>>> MPI_BSEND_OVERHEAD : ', mpi_bsend_overhead;
CALL flush(7000+rank)
197 WRITE(7000+rank,*)
'>>> nBuffsize : ', nbuffsize;
CALL flush(7000+rank)
199 CALL assert(nbuffsize.GT.0,
'initRemap nBuffsize')
202 ALLOCATE(remapbuffer(nbuffsize), stat=i)
203 CALL assert(i.eq.0,
'MPI remapBuffer allocation failed in initRemap')
204 CALL mpi_buffer_attach(remapbuffer, nbuffsize, mpi_err)
207 IF (.NOT.
ALLOCATED(bcyclicstartblockproc))
ALLOCATE (bcyclicstartblockproc(nranks))
208 IF (.NOT.
ALLOCATED(bcyclicendblockproc))
ALLOCATE (bcyclicendblockproc(nranks))
212 CALL setuptomnspallgather
213 CALL computeallgatherparameters
215 END SUBROUTINE initremap
221 SUBROUTINE finalizeremap
223 IF(
ALLOCATED(bcyclicstartblockproc))
DEALLOCATE(bcyclicstartblockproc)
224 IF(
ALLOCATED(bcyclicendblockproc))
DEALLOCATE(bcyclicendblockproc)
225 IF(
ALLOCATED(remapbuffer))
DEALLOCATE(remapbuffer)
227 END SUBROUTINE finalizeremap
235 SUBROUTINE bcyclicmapping
238 INTEGER :: startblock, endblock
239 INTEGER :: lload, sload, myload
240 INTEGER :: numL, numS
242 LOGICAL :: lnum, lnumg=.true.
244 CALL assert(initremapdone, &
245 'Calling bcyclicMapping routine without calling initRemap')
247 IF (mappingdone)
RETURN
249 lload=ceiling(real(n)/activeranks)
250 sload=floor(real(n)/activeranks)
252 IF (lload.EQ.sload)
THEN
255 IF (rank.LT.mod(n,activeranks))
THEN
262 IF (sload.EQ.lload)
THEN
266 IF (myload.EQ.lload)
THEN
270 numl=mod(n,activeranks)
275 IF (rank.LT.activeranks)
THEN
276 startblock=numl*lload+nums*sload
277 endblock=startblock+myload-1
284 startblock=startblock+1
287 CALL mpi_allgather(startblock,1,mpi_integer,bcyclicstartblockproc,&
288 &1,mpi_integer,siesta_comm,mpi_err)
290 CALL mpi_allgather(endblock,1,mpi_integer,bcyclicendblockproc,&
291 &1,mpi_integer,siesta_comm,mpi_err)
293 startglobrow=bcyclicstartblockproc(rank+1)
294 endglobrow=bcyclicendblockproc(rank+1)
296 firstpartition_ge_2=.false.
297 IF((bcyclicendblockproc(1)-bcyclicstartblockproc(1)+1).GE.2) firstpartition_ge_2=.true.
299 lastpartition_ge_2=.false.
300 IF((bcyclicendblockproc(activeranks)-bcyclicstartblockproc(activeranks)+1).GE.2) lastpartition_ge_2=.true.
302 numblocks=bcyclicendblockproc(rank+1)-bcyclicstartblockproc(rank+1)+1
305 lnum = numblocks.GE.2
306 CALL mpi_reduce(lnum, lnumg, 1, mpi_logical, mpi_land, 0, siesta_comm, &
309 CALL assert(lnumg,
'NS/nranks < 2...use smaller number of processors')
312 END SUBROUTINE bcyclicmapping
319 SUBROUTINE computeallgatherparameters
323 CALL assert(mappingdone,
'computeAllGatherParameters')
325 IF(.NOT.
ALLOCATED(rcounts))
ALLOCATE(rcounts(activeranks), rcountsns(activeranks))
326 IF(.NOT.
ALLOCATED(disp))
ALLOCATE(disp(activeranks),dispns(activeranks))
329 rcountsns(i)=(bcyclicendblockproc(i)-bcyclicstartblockproc(i)+1)
330 rcounts(i) =(bcyclicendblockproc(i)-bcyclicstartblockproc(i)+1)*m
333 disp(1)=0; dispns(1)=0
335 dispns(i)=dispns(i-1)+rcountsns(i-1)
336 disp(i)=disp(i-1)+rcounts(i-1)
339 END SUBROUTINE computeallgatherparameters
345 SUBROUTINE search(query,FOUND,location)
348 INTEGER,
INTENT(IN) :: query
349 LOGICAL,
INTENT(OUT) :: FOUND
350 INTEGER,
INTENT(OUT) :: location
353 CALL assert(mappingdone,
'search')
356 activeranks=activeranks
357 IF (activeranks.GT.n) activeranks=n
362 IF ((bcyclicstartblockproc(p).LE.query).AND.(query.LE.bcyclicendblockproc(p)))
THEN
369 END SUBROUTINE search
373 SUBROUTINE setblocktridatastruct(it, br, ic, coldata)
375 REAL(dp),
DIMENSION(M),
INTENT(IN) :: coldata
376 INTEGER,
INTENT(IN) :: br, ic, it
378 IF (it.EQ.upper)
THEN
379 CALL setblockrowcol(br,ic,coldata,upper)
380 ELSE IF (it.EQ.diag)
THEN
381 CALL setblockrowcol(br,ic,coldata,diag)
382 ELSE IF (it.EQ.lower)
THEN
383 CALL setblockrowcol(br,ic,coldata,lower)
384 ELSE IF (it.EQ.savediag)
THEN
385 CALL storediagonal(br,ic,coldata)
387 WRITE(*,*)
'Something wrong in ', rank,mpi_status(mpi_tag),br,ic,it
388 CALL assert(.false.,
'IT wrong SetBlockTriDataStruct:')
390 END SUBROUTINE setblocktridatastruct
394 SUBROUTINE send(columnData,blockRowNum,blockRowType,columnNum, procNum)
396 REAL(dp),
DIMENSION(1:M),
INTENT(IN) :: columnData
397 INTEGER,
INTENT(IN) :: blockRowNum, blockRowType, columnNum
398 INTEGER,
INTENT(OUT) :: procNum
400 CHARACTER,
DIMENSION(PACKSIZE) :: sendbuf
405 CALL mpi_pack(blockrownum,1,mpi_integer,sendbuf,packsize,positn,siesta_comm,mpi_err)
406 CALL mpi_pack(columnnum,1,mpi_integer,sendbuf,packsize,positn,siesta_comm,mpi_err)
407 CALL mpi_pack(columndata,m,mpi_real8,sendbuf,packsize,positn,siesta_comm,mpi_err)
410 CALL search(blockrownum,found,procnum)
412 IF(procnum-1.EQ.rank)
THEN
413 IF (blockrowtype.EQ.upper)
THEN
414 CALL setblocktridatastruct(upper,blockrownum,columnnum,columndata)
415 ELSE IF (blockrowtype.EQ.savediag)
THEN
416 CALL setblocktridatastruct(savediag,blockrownum,columnnum,columndata)
417 ELSE IF (blockrowtype.EQ.diag)
THEN
418 CALL setblocktridatastruct(diag,blockrownum,columnnum,columndata)
419 ELSE IF (blockrowtype.EQ.lower)
THEN
420 CALL setblocktridatastruct(lower,blockrownum,columnnum,columndata)
422 CALL assert(.false.,
'send error, blockRowType:')
426 CALL mpi_bsend(sendbuf,positn,mpi_packed,procnum-1,blockrowtype,siesta_comm,mpi_err)
428 CALL mpi_send(sendbuf,positn,mpi_packed,procnum-1,blockrowtype,siesta_comm,mpi_err)
432 CALL assert(mappingdone,
'send')
439 SUBROUTINE receive (IPROBEFLAG)
441 LOGICAL,
INTENT(IN) :: IPROBEFLAG
443 REAL(dp),
DIMENSION(M) :: coldata
444 CHARACTER,
DIMENSION(PACKSIZE) :: recvbuf
445 INTEGER :: br, ic, it
449 IF(iprobeflag)
CALL mpi_iprobe (mpi_any_source,mpi_any_tag,siesta_comm,flag,mpi_status,mpi_err)
451 CALL mpi_recv(recvbuf,packsize,mpi_packed,mpi_any_source,&
452 &mpi_any_tag,siesta_comm,mpi_status,mpi_err)
455 it=mpi_status(mpi_tag)
456 IF (it.NE.1.AND.it.NE.2.AND.it.NE.3.AND.it.NE.4)
THEN
457 WRITE(tofu,*)
'MPI_TAG:',it;
FLUSH(tofu)
458 CALL assert(.false.,
'receive 1 error')
461 CALL mpi_unpack(recvbuf,packsize,positn,br,1,mpi_integer,siesta_comm,mpi_err)
462 CALL mpi_unpack(recvbuf,packsize,positn,ic,1,mpi_integer,siesta_comm,mpi_err)
463 CALL mpi_unpack(recvbuf,packsize,positn,coldata,m,mpi_real8,siesta_comm,mpi_err)
464 localbrow=br-bcyclicstartblockproc(rank+1)+1
466 IF (localbrow.LT.1.OR.localbrow.GT.numblocks)
THEN
467 WRITE(tofu,*)
'localbrow:',localbrow;
FLUSH(tofu)
468 CALL assert(.false.,
'receive 2 error')
472 CALL setblockrowcol(br,ic,coldata,1)
473 ELSE IF (it.EQ.2)
THEN
474 CALL setblockrowcol(br,ic,coldata,2)
475 ELSE IF (it.EQ.3)
THEN
476 CALL setblockrowcol(br,ic,coldata,3)
477 ELSE IF (it.EQ.4)
THEN
478 CALL storediagonal(br,ic,coldata)
480 WRITE(*,*)
'Something wrong in ', rank,mpi_status(mpi_tag),br,ic,it
481 CALL assert(.false.,
'receive 3 error')
485 END SUBROUTINE receive
493 SUBROUTINE getfullsolution(invec,outvec)
495 REAL(dp),
DIMENSION(1:N*M),
INTENT(IN) :: invec
496 REAL(dp),
DIMENSION(N,M),
INTENT(OUT) :: outvec
498 INTEGER :: numBlocks, cnt, indx, offset
501 numblocks=bcyclicendblockproc(p)-bcyclicstartblockproc(p)+1
503 offset=(bcyclicstartblockproc(p)-1)*m+i
505 outvec(bcyclicstartblockproc(p)+i-1,j)=invec(offset+(j-1)*numblocks)
510 END SUBROUTINE getfullsolution
514 SUBROUTINE setblockrowcol( globrow, colnum, buf, opt)
516 REAL(dp),
INTENT(IN),
DIMENSION(M) :: buf
517 INTEGER :: colnum, opt
519 CALL setmatrixrowcolu( globrow, buf, colnum )
520 ELSE IF (opt.EQ.2)
THEN
521 CALL setmatrixrowcold( globrow, buf, colnum )
522 ELSE IF (opt.EQ.3)
THEN
523 CALL setmatrixrowcoll( globrow, buf, colnum )
525 WRITE(*,*)
'Error in diagonal type option'
527 END SUBROUTINE setblockrowcol
531 SUBROUTINE checkpoint(ckpt, infname)
533 INTEGER,
INTENT(IN) :: ckpt
534 CHARACTER(3) :: infname
536 CALL mpi_barrier(siesta_comm, mpi_err)
537 WRITE(90000+rank,*)
'CheckPoint: Location ',infname,
' @ pt',ckpt,
'in rank', rank
538 CALL flush(90000+rank)
540 END SUBROUTINE checkpoint
544 SUBROUTINE writetime(lfname, ofname, ltagname, tagname, usedtime, spass)
546 INTEGER,
INTENT(IN) :: lfname, ltagname, spass
547 CHARACTER(len=lfname),
INTENT(IN) :: ofname
548 CHARACTER(len=ltagname),
INTENT(IN) :: tagname
549 DOUBLE PRECISION,
INTENT(IN) :: usedtime
551 IF (spass.EQ.-1)
THEN
552 IF(sksdbg)
WRITE(tofu,*) ofname,
" : ", tagname,
" : ", usedtime
553 IF(sksdbg)
FLUSH(tofu)
555 IF(sksdbg)
WRITE(tofu,*) ofname,
" : ", tagname,
" : ",usedtime, spass
556 IF(sksdbg)
FLUSH(tofu)
559 END SUBROUTINE writetime
563 SUBROUTINE setuptomnspallgather()
566 setuptomnspallgatherdone=.false.
568 IF (.NOT.
ALLOCATED(mnspcounts))
ALLOCATE (mnspcounts(nranks))
569 IF (.NOT.
ALLOCATED(mnspdisps))
ALLOCATE (mnspdisps(nranks))
572 mnspcounts(i)=(bcyclicendblockproc(i)-bcyclicstartblockproc(i)+1)*linblksize
577 mnspdisps(i)=mnspdisps(i-1)+mnspcounts(i-1)
580 setuptomnspallgatherdone=.true.
582 END SUBROUTINE setuptomnspallgather
590 CALL mpi_allreduce(total_time,total_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
591 CALL mpi_allreduce(construct_hessian_time,construct_hessian_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
592 CALL mpi_allreduce(asymmetry_check_time,asymmetry_check_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
593 CALL mpi_allreduce(block_factorization_time,block_factorization_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
594 CALL mpi_allreduce(hessian_funct_island_time,hessian_funct_island_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
595 CALL mpi_allreduce(time_update_upperv,update_upperv_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
596 CALL mpi_allreduce(time_init_state,init_state_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
597 CALL mpi_allreduce(time_update_bfield,update_bfield_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
598 CALL mpi_allreduce(time_update_pres,update_pres_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
599 CALL mpi_allreduce(time_update_force,update_force_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
600 CALL mpi_allreduce(cv_current_time,cv_currents_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
601 CALL mpi_allreduce(get_force_harmonics_time,get_force_harmonics_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
602 CALL mpi_allreduce(bhtobf_time,bhtobf_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
603 CALL mpi_allreduce(tomnsp_time,tomnsp_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
604 CALL mpi_allreduce(toijsp_time,toijsp_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
605 CALL mpi_allreduce(to_full_mesh_time,to_full_mesh_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
606 CALL mpi_allreduce(gmres_time,gmres_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
607 CALL mpi_allreduce(gmres_wrap_time,gmres_wrap_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
608 CALL mpi_allreduce(paryax_time,paryax_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
609 CALL mpi_allreduce(sendrecv_time,sendrecv_time_max,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
612 CALL mpi_allreduce(time_total,total_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
613 CALL mpi_allreduce(construct_hessian_time,construct_hessian_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
614 CALL mpi_allreduce(asymmetry_check_time,asymmetry_check_time_min,1,mpi_real8,mpi_max,siesta_comm,mpi_err)
615 CALL mpi_allreduce(block_factorization_time,block_factorization_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
616 CALL mpi_allreduce(hessian_funct_island_time,hessian_funct_island_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
617 CALL mpi_allreduce(time_update_upperv,update_upperv_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
618 CALL mpi_allreduce(time_init_state,init_state_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
619 CALL mpi_allreduce(time_update_bfield,update_bfield_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
620 CALL mpi_allreduce(time_update_pres,update_pres_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
621 CALL mpi_allreduce(time_update_force,update_force_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
622 CALL mpi_allreduce(cv_current_time,cv_currents_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
623 CALL mpi_allreduce(get_force_harmonics_time,get_force_harmonics_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
624 CALL mpi_allreduce(bhtobf_time,bhtobf_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
625 CALL mpi_allreduce(tomnsp_time,tomnsp_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
626 CALL mpi_allreduce(toijsp_time,toijsp_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
627 CALL mpi_allreduce(to_full_mesh_time,to_full_mesh_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
628 CALL mpi_allreduce(gmres_time,gmres_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
629 CALL mpi_allreduce(gmres_wrap_time,gmres_wrap_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
630 CALL mpi_allreduce(paryax_time,paryax_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
631 CALL mpi_allreduce(sendrecv_time,sendrecv_time_min,1,mpi_real8,mpi_min,siesta_comm,mpi_err)
633 WRITE (5000+rank, *)
' Total runtime :', time_total
634 WRITE (5000+rank, *)
' *Time spent in init_data :', init_data_time
635 WRITE (5000+rank, *)
' *Time spent in init_metric_elements :', init_metric_elements_time
636 WRITE (5000+rank, *)
' **Time spent in init_timers :', init_timers_time
637 WRITE (5000+rank, *)
' **Time spent in read_wout_file :', read_wout_file_time
638 WRITE (5000+rank, *)
' **Time spent in Spline_Fourier_Modes :', spline_fourier_modes_time
639 WRITE (5000+rank, *)
' **Time spent in Add_Ghost_Points :', add_ghost_points_time
640 WRITE (5000+rank, *)
' **Time spent in Spline_OneD_Array :', spline_oned_array_time
641 WRITE (5000+rank, *)
' **Time spent in LoadRZL_VMEC :', loadrzl_vmec_time
643 WRITE (5000+rank, *)
' *Time spent in test_fourier :', test_fourier_time
644 WRITE (5000+rank, *)
' *Time spent in init_quantities :', init_quantities_time
645 WRITE (5000+rank, *)
' *Time spent in init_evolution :', init_evolution_time
646 WRITE (5000+rank, *)
' *Time spent in converge_diagonal :', converge_diagonal_time
647 WRITE (5000+rank, *)
' *Time spent in comp_diag_elements :', comp_diag_elements_time
648 WRITE (5000+rank, *)
' *Time spent in converge_blocks :', converge_blocks_time
650 WRITE (5000+rank, *)
' '
651 WRITE (5000+rank, *)
' Time spent in converge_diagonal :', converge_diagonal_time
652 WRITE (5000+rank, *)
' *diag_evolve :', diag_evolve_time
653 WRITE (5000+rank, *)
' *diag_add_pert :', diag_add_pert_time
654 WRITE (5000+rank, *)
' *Time spent in comp_diag_elements :', comp_diag_elements_time
656 WRITE (5000+rank, *)
' '
657 WRITE (5000+rank, *)
' Time spent in converge_blocks :', converge_blocks_time
658 WRITE (5000+rank, *)
' *block_evolve :', block_evolve_time
659 WRITE (5000+rank, *)
' *block_add_pert :', block_add_pert_time
661 WRITE (5000+rank, *)
' '
662 WRITE (5000+rank, *)
' Time spent in block_evolve :', block_evolve_time
663 WRITE (5000+rank, *)
' *Time spent in Compute_Hessian_Blocks :', compute_hessian_time
664 WRITE (5000+rank, *)
' *Time spent in evolve_funct_island :', evolve_funct_island_time
665 WRITE (5000+rank, *)
' *Time spent in GMRES :', gmres_time
666 WRITE (5000+rank, *)
' *Time spent in conj_grad :', conj_grad_time
667 WRITE (5000+rank, *)
' *Time spent in evolve_restart_file_time :', evolve_restart_file_time
668 WRITE (5000+rank, *)
' *Time spent in evolve_add_resistive_E_time :', evolve_add_resistive_e_time
670 WRITE (5000+rank, *)
' '
671 WRITE (5000+rank, *)
' Time spent in Compute_Hessian_Blocks'
672 WRITE (5000+rank, *)
' Time spent in Hessian_construction :', construct_hessian_time
673 WRITE (5000+rank, *)
' Time spent in Hessian_assymetry :', asymmetry_check_time
674 WRITE (5000+rank, *)
' Time spent in block_factorization :', block_factorization_time
676 WRITE (5000+rank, *)
' '
677 WRITE (5000+rank, *)
' Time spent in hess_funct_island :', hessian_funct_island_time
678 WRITE (5000+rank, *)
' *Time spent in update_upperv :', time_update_upperv
679 WRITE (5000+rank, *)
' *Time spent in init_state :', time_init_state
680 WRITE (5000+rank, *)
' *Time spent in update_bfield :', time_update_bfield
681 WRITE (5000+rank, *)
' *Time spent in update_pres :', time_update_pres
682 WRITE (5000+rank, *)
' *Time spent in update_force :', time_update_force
684 WRITE (5000+rank, *)
' '
685 WRITE (5000+rank, *)
' Time spent in cv_currents :', cv_current_time
686 WRITE (5000+rank, *)
' Time spent in get_force_harmonics :', get_force_harmonics_time
687 WRITE (5000+rank, *)
' Time spent in bhtobf :', bhtobf_time
688 WRITE (5000+rank, *)
' Time spent in toijsp :', toijsp_time
689 WRITE (5000+rank, *)
' Time spent in tomnsp :', tomnsp_time
691 WRITE (5000+rank, *)
' '
692 WRITE (5000+rank, *)
' Time spent in GMRES :', gmres_time
693 WRITE (5000+rank, *)
' Time spent in gmres_funct_island :', gmres_funct_island_time
694 WRITE (5000+rank, *)
' Time spent in gmres_init_dgmres :', gmres_init_dgmres_time
695 WRITE (5000+rank, *)
' Time spent in gmres_wrap :', gmres_wrap_time
696 WRITE (5000+rank, *)
' Time spent in gmresr :', gmresr_time
698 WRITE (5000+rank, *)
' '
699 WRITE (5000+rank, *)
' Time spent in drive_dgmres :', drive_dgmres_time
700 WRITE (5000+rank, *)
' Time spent in ParyAx :', paryax_time
701 WRITE (5000+rank, *)
' Time spent in dcopy :', dcopy_time
702 WRITE (5000+rank, *)
' Time spent in apply_precond_time :', time_apply_precon
703 WRITE (5000+rank, *)
' Time spent in dgemv :', dgemv_time
704 WRITE (5000+rank, *)
' Time spent in getnlforce :', getnlforce_time
705 WRITE (5000+rank, *)
' Time spent in allgather :', gmres_wrap_allgather_time
706 WRITE (5000+rank, *)
' Time spent in allreduce :', gmres_wrap_allreduce_time
708 END SUBROUTINE gettimes
711 END MODULE nscalingtools