Line data Source code
1 :
2 : #if defined HAVE_CONFIG_H
3 : #include "config.h"
4 : #endif
5 : !!****m* ABINIT/m_CtqmcInterface
6 : !! NAME
7 : !! m_CtqmcInterface
8 : !!
9 : !! FUNCTION
10 : !! Manage a ctqmc simulation.
11 : !! friendly interface for the user
12 : !!
13 : !! COPYRIGHT
14 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
15 : !! This file is distributed under the terms of the
16 : !! GNU General Public License, see ~abinit/COPYING
17 : !! or http://www.gnu.org/copyleft/gpl.txt .
18 : !!
19 : !! NOTES
20 : !!
21 : !! SOURCE
22 :
23 : #include "defs.h"
24 : MODULE m_CtqmcInterface
25 : USE m_Ctqmc
26 : USE m_global
27 :
28 : IMPLICIT NONE
29 :
30 : !!***
31 :
32 : PRIVATE
33 :
34 : !!****t* m_CtqmcInterface/CtqmcInterface
35 : !! NAME
36 : !! CtqmcInterface
37 : !!
38 : !! FUNCTION
39 : !! This structured datatype contains the necessary data
40 : !!
41 : !! COPYRIGHT
42 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
43 : !! This file is distributed under the terms of the
44 : !! GNU General Public License, see ~abinit/COPYING
45 : !! or http://www.gnu.org/copyleft/gpl.txt .
46 : !!
47 : !! SOURCE
48 :
49 : TYPE, PUBLIC :: CtqmcInterface
50 : TYPE(Ctqmc), POINTER :: Hybrid
51 : TYPE(Ctqmc), ALLOCATABLE :: Hybrid_chains(:)
52 : INTEGER _PRIVATE :: num_chains = 1
53 : INTEGER _PRIVATE :: opt_fk = 0
54 : INTEGER _PRIVATE :: opt_order = 0
55 : INTEGER _PRIVATE :: opt_histo = 0
56 : INTEGER _PRIVATE :: opt_movie = 0
57 : INTEGER _PRIVATE :: opt_analysis = 0
58 : INTEGER _PRIVATE :: opt_check = 0
59 : INTEGER _PRIVATE :: opt_spectra = 0
60 : INTEGER _PRIVATE :: opt_noise = 0
61 : INTEGER _PRIVATE :: opt_gMove = 0
62 : END TYPE CtqmcInterface
63 : !!***
64 :
65 : PUBLIC :: CtqmcInterface_init
66 : PUBLIC :: CtqmcInterface_setOpts
67 : PUBLIC :: CtqmcInterface_run
68 : PUBLIC :: CtqmcInterface_setSweeps
69 : PUBLIC :: CtqmcInterface_finalize
70 :
71 : CONTAINS
72 : !!***
73 :
74 : !!****f* ABINIT/m_CtqmcInterface/CtqmcInterface_init
75 : !! NAME
76 : !! CtqmcInterface_init
77 : !!
78 : !! FUNCTION
79 : !! Initialize with permanent parameters
80 : !!
81 : !! COPYRIGHT
82 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
83 : !! This file is distributed under the terms of the
84 : !! GNU General Public License, see ~abinit/COPYING
85 : !! or http://www.gnu.org/copyleft/gpl.txt .
86 : !!
87 : !! INPUTS
88 : !! this=ctqmcinterface
89 : !! iseed=seed for rng
90 : !! sweeps=number of sweeps for the run
91 : !! thermalization=number of sweeps to thermalize
92 : !! measurements=how often we measure (modulo)
93 : !! flavors=number of orbitals (spin degenerated)
94 : !! samples=imaginary time slices
95 : !! beta=inverse temperature
96 : !! U=interaction parameter
97 : !! ostream=where to write output
98 : !! MPI_COMM=mpi communicator for the run
99 : !!
100 : !! OUTPUT
101 : !!
102 : !! SIDE EFFECTS
103 : !!
104 : !! NOTES
105 : !!
106 : !! SOURCE
107 :
108 72 : SUBROUTINE CtqmcInterface_init(this,iseed,sweeps,thermalization,measurements,flavors,samples,beta,U,ostream,num_chains,&
109 : & MPI_COMM,nspinor)
110 :
111 : !Arguments ------------------------------------
112 : TYPE(CtqmcInterface), INTENT(INOUT), TARGET :: this
113 : INTEGER, OPTIONAL, INTENT(IN) :: MPI_COMM
114 : INTEGER, INTENT(IN) :: iseed
115 : DOUBLE PRECISION, INTENT(IN) :: sweeps
116 : INTEGER, INTENT(IN) :: thermalization
117 : INTEGER, INTENT(IN) :: measurements
118 : INTEGER, INTENT(IN) :: flavors
119 : INTEGER, INTENT(IN) :: samples
120 : !INTEGER, INTENT(IN) :: Wmax
121 : INTEGER, INTENT(IN) :: ostream
122 : INTEGER, INTENT(IN) :: num_chains
123 : INTEGER, INTENT(IN) :: nspinor
124 : DOUBLE PRECISION, INTENT(IN) :: beta
125 : DOUBLE PRECISION, INTENT(IN) :: u
126 : !DOUBLE PRECISION, INTENT(IN) :: mu
127 : !Local arguements -----------------------------
128 : INTEGER :: ifstream,ichain!,opt_nondiag
129 : DOUBLE PRECISION, DIMENSION(1:10) :: buffer
130 : ! opt_nondiag=0
131 :
132 72 : ifstream = 42
133 :
134 72 : buffer(1)=DBLE(iseed)
135 72 : buffer(2)=sweeps
136 72 : buffer(3)=DBLE(thermalization)
137 72 : buffer(4)=DBLE(measurements)
138 72 : buffer(5)=DBLE(flavors)
139 72 : buffer(6)=DBLE(samples)
140 72 : buffer(7)=beta
141 72 : buffer(8)=U
142 72 : buffer(9)=GREENHYB_TAU
143 72 : buffer(10)=nspinor
144 : ! buffer(10)=DBLE(opt_nondiag)
145 : !buffer(9)=0.d0!mu
146 : !buffer(9)=DBLE(Wmax)
147 72 : this%num_chains = num_chains
148 666 : MALLOC(this%Hybrid_chains, (this%num_chains))
149 72 : this%Hybrid => this%Hybrid_chains(1)
150 72 : IF ( PRESENT( MPI_COMM ) ) THEN
151 72 : CALL Ctqmc_init(this%Hybrid, ostream, ifstream, .FALSE., MY_COMM=MPI_COMM,iBuffer=buffer)
152 : ELSE
153 0 : CALL Ctqmc_init(this%Hybrid, ostream, ifstream, .FALSE.,iBuffer=buffer)
154 : END IF
155 72 : if(this%num_chains > 1) then
156 40 : do ichain=2,this%num_chains
157 40 : IF ( PRESENT( MPI_COMM ) ) THEN
158 30 : CALL Ctqmc_init(this%Hybrid_chains(ichain), ostream, ifstream, .FALSE., MY_COMM=MPI_COMM,iBuffer=buffer)
159 : ELSE
160 0 : CALL Ctqmc_init(this%Hybrid_chains(ichain), ostream, ifstream, .FALSE.,iBuffer=buffer)
161 : END IF
162 : end do
163 : end if
164 72 : this%opt_fk = 0
165 72 : this%opt_order = 0
166 72 : this%opt_histo = 0
167 72 : this%opt_movie = 0
168 72 : this%opt_analysis = 0
169 72 : this%opt_check = 0
170 72 : this%opt_noise = 0
171 72 : this%opt_spectra = 0
172 72 : END SUBROUTINE CtqmcInterface_init
173 : !!***
174 :
175 : !!****f* ABINIT/m_CtqmcInterface/CtqmcInterface_setOpts
176 : !! NAME
177 : !! CtqmcInterface_setOpts
178 : !!
179 : !! FUNCTION
180 : !! Set and save options for many runs
181 : !!
182 : !! COPYRIGHT
183 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
184 : !! This file is distributed under the terms of the
185 : !! GNU General Public License, see ~abinit/COPYING
186 : !! or http://www.gnu.org/copyleft/gpl.txt .
187 : !!
188 : !! INPUTS
189 : !! this=ctqmcinterface
190 : !! opt_Fk=0 if we give us Gw0 and 1 if 1/Gw0+iwn
191 : !! opt_order=maximal perturbation order to scope(>0)
192 : !! opt_movie=print a latex file (0 or 1)
193 : !! opt_analysis=measure correlations (0 or 1)
194 : !! opt_check=check fast calculation :0 nothing
195 : !! 1 Impurity
196 : !! 2 Bath
197 : !! 3 Both
198 : !! opt_noise=calculate noise ofr green functions(0 ro 1)
199 : !! opt_spectra=fourier transform of time evolution of number of electrons
200 : !! (0 or 1)
201 : !! opt_gMove=number of global moves (>0)
202 : !!
203 : !! OUTPUT
204 : !!
205 : !! SIDE EFFECTS
206 : !!
207 : !! NOTES
208 : !!
209 : !! SOURCE
210 :
211 72 : SUBROUTINE CtqmcInterface_setOpts(this,opt_Fk,opt_order,opt_histo,opt_movie,&
212 : & opt_analysis,opt_check, opt_noise, opt_spectra, opt_gMove)
213 :
214 : !Arguments ------------------------------------
215 : TYPE(CtqmcInterface), INTENT(INOUT) :: this
216 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_Fk
217 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_order
218 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_histo
219 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_movie
220 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_analysis
221 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_check
222 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_noise
223 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_spectra
224 : INTEGER , OPTIONAL , INTENT(IN ) :: opt_gMove
225 :
226 72 : IF ( PRESENT(opt_Fk) ) &
227 72 : this%opt_Fk = opt_fk
228 72 : IF ( PRESENT(opt_order) ) &
229 72 : this%opt_order = opt_order
230 72 : IF ( PRESENT(opt_histo) ) &
231 72 : this%opt_histo = opt_histo
232 72 : IF ( PRESENT(opt_analysis) ) &
233 72 : this%opt_analysis = opt_analysis
234 72 : IF ( PRESENT(opt_check) ) &
235 72 : this%opt_check = opt_check
236 72 : IF ( PRESENT(opt_movie) ) &
237 72 : this%opt_movie = opt_movie
238 72 : IF ( PRESENT(opt_noise) ) &
239 72 : this%opt_noise = opt_noise
240 72 : IF ( PRESENT(opt_spectra) ) &
241 72 : this%opt_spectra = opt_spectra
242 72 : IF ( PRESENT(opt_gMove) ) &
243 72 : this%opt_gMove = opt_gMove
244 :
245 72 : END SUBROUTINE CtqmcInterface_setOpts
246 : !!***
247 :
248 : !!****f* ABINIT/m_CtqmcInterface/CtqmcInterface_run
249 : !! NAME
250 : !! CtqmcInterface_run
251 : !!
252 : !! FUNCTION
253 : !! run a ctqmc simu and get results
254 : !!
255 : !! COPYRIGHT
256 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
257 : !! This file is distributed under the terms of the
258 : !! GNU General Public License, see ~abinit/COPYING
259 : !! or http://www.gnu.org/copyleft/gpl.txt .
260 : !!
261 : !! INPUTS
262 : !! this=ctqmcinterface
263 : !! G0omega=Gw0 (according to opt_Fk)
264 : !! matU=interaction matrice
265 : !! opt_sym=weight factors to symmetrise G
266 : !! opt_levels=energy for each level (with respect to fermi level)
267 : !!
268 : !! OUTPUT
269 : !! Gtau=G(tau)
270 : !! Gw=fourier transform of Gtau
271 : !! D=full double occupancy
272 : !! E=Interaction energy
273 : !! Noise=Noise on E
274 : !!
275 : !! SIDE EFFECTS
276 : !!
277 : !! NOTES
278 : !!
279 : !! SOURCE
280 :
281 34 : SUBROUTINE CtqmcInterface_run(this,G0omega, Gtau, Gw, D,E,Noise,matU,opt_sym,opt_levels,Magmom_orb,Magmom_spin,Magmom_tot,Iatom, &
282 : &fname)
283 :
284 : !Arguments ------------------------------------
285 : TYPE(CtqmcInterface), INTENT(INOUT) :: this
286 : COMPLEX(KIND=8) , DIMENSION(:,:) , INTENT(IN ) :: G0omega
287 : DOUBLE PRECISION, DIMENSION(:,:), OPTIONAL, INTENT( OUT) :: Gtau
288 : COMPLEX(KIND=8) , DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: Gw
289 : DOUBLE PRECISION, DIMENSION(:,:), OPTIONAL, INTENT( OUT) :: D
290 : DOUBLE PRECISION , OPTIONAL, INTENT( OUT) :: E
291 : DOUBLE PRECISION , OPTIONAL, INTENT( OUT) :: Noise
292 : DOUBLE PRECISION, DIMENSION(:,:), OPTIONAL, INTENT(IN ) :: matU
293 : DOUBLE PRECISION, DIMENSION(:,:), OPTIONAL, INTENT(IN ) :: opt_sym
294 : DOUBLE PRECISION, DIMENSION(: ), OPTIONAL, INTENT(IN ) :: opt_levels
295 : DOUBLE PRECISION, DIMENSION(:,:), OPTIONAL, INTENT(IN ) :: Magmom_orb
296 : DOUBLE PRECISION, DIMENSION(:,:), OPTIONAL, INTENT(IN ) :: Magmom_spin
297 : DOUBLE PRECISION, DIMENSION(:,:), OPTIONAL, INTENT(IN ) :: Magmom_tot
298 : INTEGER, INTENT(IN ) :: Iatom
299 : INTEGER :: base_seed,ichain
300 : character(len=fnlen), INTENT(INOUT) :: fname
301 34 : CALL Ctqmc_reset(this%Hybrid)
302 34 : if(this%num_chains > 1) then
303 20 : do ichain=2,this%num_chains
304 20 : CALL Ctqmc_reset(this%Hybrid_chains(ichain))
305 : end do
306 : end if
307 :
308 : ! ifstream = 42
309 : !
310 : ! OPEN(UNIT=ifstream, FILE="Gw.dat")
311 : ! CALL Ctqmc_setG0w(Hybrid, ifstream)
312 : ! CLOSE(ifstream)
313 : !
314 :
315 34 : IF ( PRESENT(opt_levels) ) &
316 34 : CALL Ctqmc_setMu(this%Hybrid, opt_levels)
317 :
318 34 : CALL Ctqmc_setG0wTab(this%Hybrid, G0omega,this%opt_fk)
319 :
320 34 : IF ( PRESENT(matU) ) &
321 34 : CALL Ctqmc_setU(this%Hybrid, matU)
322 :
323 34 : IF ( PRESENT(Magmom_orb) ) &
324 34 : CALL Ctqmc_setMagmom(this%Hybrid, Magmom_orb, Magmom_spin, Magmom_tot)
325 :
326 34 : if(this%num_chains > 1) then
327 20 : do ichain=2,this%num_chains
328 15 : IF ( PRESENT(opt_levels) ) &
329 15 : CALL Ctqmc_setMu(this%Hybrid_chains(ichain), opt_levels)
330 :
331 15 : CALL Ctqmc_setG0wTab(this%Hybrid_chains(ichain), G0omega,this%opt_fk)
332 :
333 15 : IF ( PRESENT(matU) ) &
334 15 : CALL Ctqmc_setU(this%Hybrid_chains(ichain), matU)
335 :
336 15 : IF ( PRESENT(Magmom_orb) ) &
337 20 : CALL Ctqmc_setMagmom(this%Hybrid_chains(ichain), Magmom_orb, Magmom_spin, Magmom_tot)
338 : end do
339 : end if
340 :
341 34 : IF (this%Hybrid_chains(1)%rank == 0) THEN
342 : WRITE(this%Hybrid_chains(1)%ostream,'(a,i0,a)') &
343 19 : ' Ctqmc_run_parallel: Using ', this%num_chains, ' OpenMP chains'
344 : END IF
345 :
346 : ! If only 1 chain requested, just run serial version directly
347 34 : IF (this%num_chains == 1) THEN
348 29 : IF (this%Hybrid_chains(1)%rank == 0) THEN
349 : WRITE(this%Hybrid_chains(1)%ostream,'(a)') &
350 17 : 'Running single chain (serial mode)'
351 : END IF
352 : CALL Ctqmc_run(this%Hybrid_chains(1), &
353 : opt_order=this%opt_order, &
354 : opt_histo=this%opt_histo, &
355 : opt_movie=this%opt_movie, &
356 : opt_analysis=this%opt_analysis, &
357 : opt_check=this%opt_check, &
358 : opt_noise=this%opt_noise, &
359 : opt_spectra=this%opt_spectra, &
360 29 : opt_gMove=this%opt_gMove)
361 : ELSE
362 :
363 5 : IF (this%Hybrid_chains(1)%rank == 0) THEN
364 : WRITE(this%Hybrid_chains(1)%ostream,'(a,i0,a)') &
365 2 : 'Running ', this%num_chains, ' parallel CTQMC chains with OpenMP threads'
366 : END IF
367 :
368 :
369 : ! Save base seed and check template integrity
370 5 : base_seed = this%Hybrid_chains(1)%seed
371 :
372 : ! Copy template to each chain and set unique seed
373 25 : DO ichain = 1, this%num_chains
374 : ! Each chain gets a unique seed offset
375 20 : this%Hybrid_chains(ichain)%seed = base_seed + (ichain - 1)*this%Hybrid%size
376 20 : this%Hybrid_chains(ichain)%sweeps = this%Hybrid_chains(ichain)%sweeps / this%num_chains
377 25 : this%Hybrid_chains(ichain)%tid = ichain
378 : END DO
379 :
380 : ! Run chains in parallel
381 : !$omp parallel default(shared) private(ichain)
382 : !$omp do schedule(static)
383 25 : DO ichain = 1, this%num_chains
384 : ! Each thread runs one chain
385 20 : IF (this%Hybrid_chains(1)%rank == 0) THEN
386 : !$omp critical
387 : WRITE(this%Hybrid_chains(1)%ostream,'(a,i0,a,i0,a,i0)') &
388 8 : ' Thread ', xomp_get_thread_num(), ' running chain ', ichain, &
389 16 : ' with seed ', this%Hybrid_chains(ichain)%seed
390 : !$omp end critical
391 : END IF
392 :
393 : ! Call with optional parameters
394 : CALL Ctqmc_run(this%Hybrid_chains(ichain), &
395 : opt_order=this%opt_order, &
396 : opt_histo=this%opt_histo, &
397 : opt_movie=this%opt_movie, &
398 : opt_analysis=this%opt_analysis, &
399 : opt_check=this%opt_check, &
400 : opt_noise=this%opt_noise, &
401 : opt_spectra=this%opt_spectra, &
402 25 : opt_gMove=this%opt_gMove)
403 : END DO
404 : !$omp end do
405 : !$omp end parallel
406 :
407 : END IF
408 :
409 34 : CALL Ctqmc_getResult(this%Hybrid,this%num_chains,this%Hybrid_chains,Iatom,fname)
410 :
411 34 : IF ( PRESENT(opt_sym) ) THEN
412 0 : CALL Ctqmc_symmetrizeGreen(this%Hybrid,opt_sym)
413 : END IF
414 :
415 34 : IF ( PRESENT(Gtau) .AND. PRESENT(Gw) ) THEN
416 34 : CALL Ctqmc_getGreen(this%Hybrid, Gtau=Gtau, Gw=Gw)
417 : ! write(6,*) "size",size(Gw,dim=1),size(gw,dim=2)
418 : ! IF ( hybrid%rank .EQ. 0 ) write(389,*) Gw(:,hybrid%flavors+1)
419 : ! call flush(389)
420 0 : ELSE IF ( PRESENT(Gtau) .AND. .NOT. PRESENT(Gw) ) THEN
421 0 : CALL Ctqmc_getGreen(this%Hybrid, Gtau=Gtau)
422 0 : ELSE IF ( .NOT. PRESENT(Gtau) .AND. PRESENT(Gw) ) THEN
423 0 : CALL Ctqmc_getGreen(this%Hybrid, Gw=Gw)
424 : END IF
425 :
426 34 : IF ( PRESENT(D) ) &
427 34 : CALL Ctqmc_getD(this%Hybrid, D)
428 :
429 34 : IF ( PRESENT(E) .AND. PRESENT(Noise) ) THEN
430 0 : CALL Ctqmc_getE(this%Hybrid, E=E, Noise=Noise)
431 34 : ELSE IF ( PRESENT(E) .AND. .NOT. PRESENT(Noise) ) THEN
432 34 : CALL Ctqmc_getE(this%Hybrid, E=E)
433 0 : ELSE IF ( .NOT. PRESENT(E) .AND. PRESENT(Noise) ) THEN
434 0 : CALL Ctqmc_getE(this%Hybrid, Noise=noise)
435 : END IF
436 :
437 :
438 34 : CALL Ctqmc_printAll(this%Hybrid, this%num_chains)
439 : !CALL Ctqmc_printQMC(this%Hybrid)
440 :
441 34 : END SUBROUTINE CtqmcInterface_run
442 : !!***
443 :
444 : !!****f* ABINIT/m_CtqmcInterface/CtqmcInterface_setSweeps
445 : !! NAME
446 : !! CtqmcInterface_setSweeps
447 : !!
448 : !! FUNCTION
449 : !! change sweeps on the fly
450 : !!
451 : !! COPYRIGHT
452 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
453 : !! This file is distributed under the terms of the
454 : !! GNU General Public License, see ~abinit/COPYING
455 : !! or http://www.gnu.org/copyleft/gpl.txt .
456 : !!
457 : !! INPUTS
458 : !! this=ctqmcinterface
459 : !! sweeps=new number of sweeps
460 : !!
461 : !! OUTPUT
462 : !!
463 : !! SIDE EFFECTS
464 : !!
465 : !! NOTES
466 : !!
467 : !! SOURCE
468 :
469 0 : SUBROUTINE CtqmcInterface_setSweeps(this, sweeps)
470 :
471 : !Arguments ------------------------------------
472 : TYPE(CtqmcInterface), INTENT(INOUT) :: this
473 : DOUBLE PRECISION, INTENT(IN) :: sweeps
474 :
475 0 : CALL Ctqmc_setSweeps(this%Hybrid,sweeps)
476 0 : END SUBROUTINE CtqmcInterface_setSweeps
477 : !!***
478 :
479 : !!****f* ABINIT/m_CtqmcInterface/CtqmcInterface_finalize
480 : !! NAME
481 : !! CtqmcInterface_finalize
482 : !!
483 : !! FUNCTION
484 : !! Destroy simulation
485 : !!
486 : !! COPYRIGHT
487 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
488 : !! This file is distributed under the terms of the
489 : !! GNU General Public License, see ~abinit/COPYING
490 : !! or http://www.gnu.org/copyleft/gpl.txt .
491 : !!
492 : !! INPUTS
493 : !! this=ctqmcinterface
494 : !!
495 : !! OUTPUT
496 : !!
497 : !! SIDE EFFECTS
498 : !!
499 : !! NOTES
500 : !!
501 : !! SOURCE
502 :
503 100 : SUBROUTINE CtqmcInterface_finalize(this)
504 :
505 : !Arguments ------------------------------------
506 : TYPE(CtqmcInterface), INTENT(INOUT) :: this
507 : INTEGER :: ichain
508 :
509 : !IF ( this%Hybrid%init .EQV. .TRUE. ) THEN
510 : ! CALL Ctqmc_printAll(this%Hybrid)
511 100 : if(allocated(this%Hybrid_chains)) then
512 174 : do ichain=1,this%num_chains
513 174 : CALL Ctqmc_destroy(this%Hybrid_chains(ichain))
514 : end do
515 378 : FREE(this%Hybrid_chains)
516 : end if
517 : !END IF
518 :
519 100 : END SUBROUTINE CtqmcInterface_finalize
520 : !!***
521 :
522 0 : END MODULE m_CtqmcInterface
523 : !!***
|