Line data Source code
1 : !!****m* ABINIT/m_raman
2 : !! NAME
3 : !! m_raman
4 : !!
5 : !! FUNCTION
6 : !! Raman susceptibilities of zone-center phonons and electroo tensor.
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 1999-2026 ABINIT group (MVeithen)
10 : !! This file is distributed under the terms of the
11 : !! GNU General Public License, see ~abinit/COPYING
12 : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : !!
14 : !! SOURCE
15 :
16 : #if defined HAVE_CONFIG_H
17 : #include "config.h"
18 : #endif
19 :
20 : #include "abi_common.h"
21 :
22 : module m_raman
23 :
24 : use defs_basis
25 : use m_errors
26 : use m_abicore
27 : use m_nctk
28 : use netcdf
29 :
30 : use m_fstrings, only : sjoin
31 : use m_matrix, only : matr3inv
32 :
33 : implicit none
34 :
35 : private
36 : !!***
37 :
38 : public :: ramansus ! Raman susceptibilities of zone-center phonons.
39 : public :: electrooptic ! Electrooptic tensor and the raman tensors of zone-center phonons.
40 : public :: defwrite_nonana_raman_terms ! Write raman susceptiblities for q-->0
41 : public :: defwrite_raman_terms ! Write raman susceptiblities and frequencies for q=0
42 : !!***
43 :
44 : contains
45 : !!***
46 :
47 : !!****f* m_raman/ramansus
48 : !!
49 : !! NAME
50 : !! ramansus
51 : !!
52 : !! FUNCTION
53 : !! Compute the raman susceptibilities of zone-center phonons
54 : !!
55 : !! INPUTS
56 : !! d2cart = second order derivatives of the energy wrt all perturbations
57 : !! dchide(3,3,3) = non-linear optical coefficients from dtchi
58 : !! dchidt(natom,3,3,3) = first-order change of the electronic dielectric
59 : !! tensor induced by an individual atomic displacement
60 : !! displ = phonon mode atomic displacements
61 : !! mpert = maximum number of perturbations
62 : !! natom = number of atoms
63 : !! phfrq = phonon frequencies
64 : !! qphnrm=(described below)
65 : !! ucvol = unit cell volume
66 : !!
67 : !! OUTPUT
68 : !! qphon(3)= to be divided by qphnrm, give the phonon wavevector;
69 : !! if qphnrm==0.0_dp, then the wavevector is zero (Gamma point)
70 : !! and qphon gives the direction of
71 : !! the induced electric field; in the latter case, if qphon is
72 : !! zero, no non-analytical contribution is included.
73 : !! rsus
74 : !!
75 : !! SOURCE
76 :
77 6 : subroutine ramansus(d2cart,dchide,dchidt,displ,mpert,natom,phfrq,qphon,qphnrm,rsus,ucvol)
78 :
79 : !Arguments -----------------------------------
80 : !scalars
81 : integer,intent(in) :: mpert,natom
82 : real(dp),intent(in) :: qphnrm,ucvol
83 : !arrays
84 : real(dp),intent(in) :: d2cart(2,3,mpert,3,mpert),dchide(3,3,3)
85 : real(dp),intent(in) :: dchidt(natom,3,3,3),displ(2,3*natom,3*natom)
86 : real(dp),intent(in) :: phfrq(3*natom)
87 : real(dp),intent(inout) :: qphon(3)
88 : real(dp),intent(out) :: rsus(3*natom,3,3)
89 :
90 : !Local variables-------------------------------
91 : !scalars
92 : integer :: analyt,i1,i1dir,i1pert,i2dir,iatom,idir,imode
93 : real(dp) :: epsq,fac,g0,g1,g2,qphon2
94 : logical :: t_degenerate,iwrite
95 : character(len=500) :: message
96 : !arrays
97 : real(dp) :: dijk_q(3,3)
98 6 : real(dp),allocatable :: zeff(:,:)
99 6 : character(len=1),allocatable :: metacharacter(:)
100 :
101 : ! *********************************************************************
102 :
103 6 : iwrite = ab_out > 0
104 :
105 18 : ABI_MALLOC(zeff,(3,natom))
106 :
107 402 : rsus(:,:,:) = zero
108 6 : epsq = zero
109 54 : zeff(:,:) = zero
110 : dijk_q(:,:) = zero
111 :
112 : !Determine the analyticity of the matrix.
113 6 : analyt=1
114 6 : if(abs(qphnrm)<tol8)analyt=0
115 6 : if(abs(qphon(1))<tol8.and.abs(qphon(2))<tol8.and.abs(qphon(3))<tol8) analyt=1
116 :
117 : !In the case the non-analyticity is required :
118 4 : if(analyt == 0) then
119 :
120 : ! Normalize the limiting direction
121 4 : qphon2=qphon(1)**2+qphon(2)**2+qphon(3)**2
122 4 : qphon(1)=qphon(1)/sqrt(qphon2)
123 4 : qphon(2)=qphon(2)/sqrt(qphon2)
124 4 : qphon(3)=qphon(3)/sqrt(qphon2)
125 :
126 : ! Get the dielectric constant for the limiting direction
127 : epsq= 0._dp
128 16 : do i1dir=1,3
129 52 : do i2dir=1,3
130 48 : epsq=epsq+qphon(i1dir)*qphon(i2dir)*d2cart(1,i1dir,natom+2,i2dir,natom+2)
131 : end do
132 : end do
133 :
134 : ! Check if epsq > 0
135 4 : if (epsq < tol8) then
136 0 : write(message,'(a,es14.6)')' The value of epsq must be > 0 while it is found to be',epsq
137 0 : ABI_BUG(message)
138 : end if
139 :
140 : ! Get the effective charges for the limiting direction
141 16 : do i1dir=1,3
142 40 : do i1pert=1,natom
143 24 : zeff(i1dir,i1pert)=zero
144 108 : do i2dir=1,3
145 : zeff(i1dir,i1pert)=zeff(i1dir,i1pert)+qphon(i2dir)*&
146 96 : & d2cart(1,i1dir,i1pert,i2dir,natom+2)
147 : end do
148 : end do
149 : end do
150 :
151 : ! Get the NLO tensor for the limiting direction !$\sum_{k} d_{ijk} \cdot q_k$
152 :
153 4 : dijk_q(:,:) = zero
154 16 : do i1dir = 1, 3
155 52 : do i2dir = 1, 3
156 156 : do idir = 1, 3
157 144 : dijk_q(i1dir,i2dir) = dijk_q(i1dir,i2dir) + dchide(i1dir,i2dir,idir)*qphon(idir)
158 : end do
159 : end do
160 : end do
161 :
162 4 : fac = 16._dp*pi/(ucvol*epsq)
163 28 : do imode = 1, 3*natom
164 76 : do iatom = 1, natom
165 216 : do idir = 1, 3
166 144 : i1=idir + (iatom - 1)*3
167 : rsus(imode,:,:) = rsus(imode,:,:) + &
168 : & (dchidt(iatom,idir,:,:) - fac*zeff(idir,iatom)*dijk_q(:,:))* &
169 1920 : & displ(1,i1,imode)
170 : end do ! disp
171 : end do ! iatom
172 : end do ! imode
173 268 : rsus(:,:,:) = rsus(:,:,:)*sqrt(ucvol)
174 :
175 : else
176 14 : do imode = 1, 3*natom
177 38 : do iatom = 1, natom
178 108 : do idir = 1, 3
179 72 : i1=idir + (iatom - 1)*3
180 960 : rsus(imode,:,:) = rsus(imode,:,:) + dchidt(iatom,idir,:,:)*displ(1,i1,imode)
181 : end do ! disp
182 : end do ! iatom
183 : end do ! imode
184 134 : rsus(:,:,:) = rsus(:,:,:)*sqrt(ucvol)
185 : end if ! analyt == 0
186 :
187 6 : if (analyt == 0) then
188 4 : if (iwrite) then
189 4 : write(ab_out,*) ch10
190 : write(ab_out, '(a,/,a,3f9.5)' )&
191 4 : & ' Raman susceptibility of zone-center phonons, with non-analyticity in the',&
192 20 : & ' direction (cartesian coordinates)',qphon(1:3)+tol10
193 : write(ab_out,'(a)')&
194 4 : & ' -----------------------------------------------------------------------'
195 4 : write(ab_out,*) ch10
196 : end if
197 :
198 : else
199 2 : if (iwrite) then
200 2 : write(ab_out,*) ch10
201 2 : write(ab_out,*)' Raman susceptibilities of transverse zone-center phonon modes'
202 2 : write(ab_out,*)' -------------------------------------------------------------'
203 2 : write(ab_out,*) ch10
204 : end if
205 : end if
206 :
207 : !Examine the degeneracy of each mode. The portability of the echo of the Raman susceptibility
208 : !for each degenerate mode is very hard to guarantee. On the contrary,
209 : !the scalar reductions of these quantities are OK.
210 24 : ABI_MALLOC(metacharacter,(3*natom))
211 42 : do imode=1,3*natom
212 : ! The degenerate modes are not portable
213 36 : t_degenerate=.false.
214 36 : if(imode>1)then
215 30 : if(phfrq(imode)-phfrq(imode-1)<tol6)t_degenerate=.true.
216 : end if
217 36 : if(imode<3*natom)then
218 30 : if(phfrq(imode+1)-phfrq(imode)<tol6)t_degenerate=.true.
219 : end if
220 36 : metacharacter(imode)=';'
221 42 : if(t_degenerate)metacharacter(imode)='-'
222 : end do
223 :
224 42 : do imode = 1, 3*natom
225 36 : if (iwrite) then
226 36 : write(ab_out,'(a4,i3,2x,a2,f7.2,a6)')' Mode',imode,' (',phfrq(imode)*Ha_cmm1,' cm-1)'
227 144 : do idir = 1,3
228 144 : write(ab_out,'(a,4x,3(f16.9,2x))')metacharacter(imode),rsus(imode,idir,:)
229 : end do
230 : end if
231 : ! See R. Caracas and X. Gonze, Thermodynamic Properties of Solids : experiment and modeling, Wiley-VCH,
232 : ! Ed. S. Chaplot and R. Mittal and N. Choudhury , chap. 8, pp 291-312.
233 36 : g0=(rsus(imode,1,1)+rsus(imode,2,2)+rsus(imode,3,3))**2*third
234 : g1=((rsus(imode,1,2)-rsus(imode,2,1))**2+&
235 : & (rsus(imode,1,3)-rsus(imode,3,1))**2+&
236 36 : & (rsus(imode,2,3)-rsus(imode,3,2))**2)*half
237 : g2=((rsus(imode,1,2)+rsus(imode,2,1))**2+&
238 : & (rsus(imode,1,3)+rsus(imode,3,1))**2+&
239 : & (rsus(imode,2,3)+rsus(imode,3,2))**2)*half +&
240 : & ((rsus(imode,1,1)-rsus(imode,2,2))**2+&
241 : & (rsus(imode,2,2)-rsus(imode,3,3))**2+&
242 36 : & (rsus(imode,3,3)-rsus(imode,1,1))**2)*third
243 42 : if (iwrite) then
244 36 : write(ab_out,'(3(a,f16.9))')' Spherical averages : G0=',g0,' G1=',g1,' G2=',g2
245 36 : write(ab_out,*)
246 : end if
247 : end do
248 :
249 6 : ABI_FREE(metacharacter)
250 6 : ABI_FREE(zeff)
251 :
252 6 : end subroutine ramansus
253 : !!***
254 :
255 : !!****f* m_raman/electrooptic
256 : !! NAME
257 : !! electrooptic
258 : !!
259 : !! FUNCTION
260 : !! Compute the electrooptic tensor and the raman tensors of zone-center phonons
261 : !!
262 : !! INPUTS
263 : !! dchide(3,3,3) = non-linear optical coefficients
264 : !! dieflag= dielectric tensor flag. 0=> no dielectric tensor,
265 : !! 1=> frequency-dependent dielectric tensor,
266 : !! 2=> only the electronic dielectric tensor.
267 : !! epsinf=electronic dielectric tensor
268 : !! fact_oscstr(2,3,3*natom)=factors of the oscillator strengths for the different eigenmodes,
269 : !! for different direction of the electric field
270 : !! natom=number of atoms in unit cell
271 : !! phfrq(3*natom)=phonon frequencies (square root of the dynamical
272 : !! matrix eigenvalues, except if these are negative, and in this
273 : !! case, give minus the square root of the absolute value
274 : !! of the matrix eigenvalues). Hartree units.
275 : !! prtmbm= if equal to 1 write out the mode by mode decomposition of the EO tensor
276 : !! rsus = Raman susceptibilities
277 : !! ucvol=unit cell volume
278 : !!
279 : !! OUTPUT
280 : !! (to be completed ?)
281 : !!
282 : !! NOTES
283 : !! 1. The phonon frequencies phfrq should correspond to the
284 : !! wavevector at Gamma, without any non-analyticities.
285 : !! 2. Should clean for no imaginary part ...
286 : !! This routine should be used only by one processor.
287 : !! 3. frdiel(3,3,nfreq)= frequency-dependent dielectric tensor
288 : !! mode effective charges for the different eigenmodes,
289 : !! for different direction of the electric field
290 : !!
291 : !! SOURCE
292 :
293 2 : subroutine electrooptic(dchide,dieflag,epsinf,fact_oscstr,natom,phfrq,prtmbm,rsus,ucvol)
294 :
295 : !Arguments -------------------------------
296 : !scalars
297 : integer,intent(in) :: dieflag,natom,prtmbm
298 : real(dp),intent(in) :: ucvol
299 : !arrays
300 : real(dp),intent(in) :: dchide(3,3,3),epsinf(3,3),fact_oscstr(2,3,3*natom)
301 : real(dp),intent(in) :: phfrq(3*natom),rsus(3*natom,3,3)
302 :
303 : !Local variables -------------------------
304 : !scalars
305 : integer :: flag,i1,i2,ii,imode,jj,kk
306 : real(dp) :: dtm,fac
307 : logical :: iwrite
308 : character(len=500) :: message
309 : !arrays
310 : integer :: voigtindex(6,2)
311 : real(dp) :: eta(3,3),rvoigt(6,3),work(3,3,3)
312 2 : real(dp),allocatable :: rijk(:,:,:,:),rijk_tot(:,:,:)
313 :
314 : ! *********************************************************************
315 :
316 : !rijk(1:3*natom,:,:,:) = mode by mode decomposition of the electrooptic tensor
317 : !rijk(3*natom+1,:,:,:) = electronic contribution
318 2 : iwrite = ab_out > 0
319 :
320 2 : voigtindex(1,1) = 1 ; voigtindex(1,2) = 1
321 2 : voigtindex(2,1) = 2 ; voigtindex(2,2) = 2
322 2 : voigtindex(3,1) = 3 ; voigtindex(3,2) = 3
323 2 : voigtindex(4,1) = 2 ; voigtindex(4,2) = 3
324 2 : voigtindex(5,1) = 1 ; voigtindex(5,2) = 3
325 2 : voigtindex(6,1) = 1 ; voigtindex(6,2) = 2
326 :
327 12 : ABI_MALLOC(rijk,(3*natom+1,3,3,3))
328 2 : ABI_MALLOC(rijk_tot,(3,3,3))
329 458 : rijk(:,:,:,:) = 0._dp
330 80 : rijk_tot(:,:,:) = 0._dp
331 :
332 :
333 : !In case there is no mode with truly negative frequency
334 : !and the electronic dielectric tensor is available
335 : !compute the electro-optic tensor
336 :
337 2 : flag = 1
338 :
339 2 : if (abs(phfrq(1)) > abs(phfrq(4))) then
340 0 : flag = 0
341 : write(message,'(6a)')&
342 0 : & 'The lowest mode appears to be a "true" negative mode,',ch10,&
343 0 : & 'and not an acoustic mode. This precludes the computation',ch10,&
344 0 : & 'of the EO tensor.',ch10
345 0 : ABI_WARNING(message)
346 : end if
347 :
348 : dtm = epsinf(1,1)*epsinf(2,2)*epsinf(3,3) + &
349 : & epsinf(1,2)*epsinf(2,3)*epsinf(3,1) + &
350 : & epsinf(1,3)*epsinf(2,1)*epsinf(3,2) - &
351 : & epsinf(3,1)*epsinf(2,2)*epsinf(1,3) - &
352 : & epsinf(3,2)*epsinf(2,3)*epsinf(1,1) - &
353 2 : & epsinf(3,3)*epsinf(2,1)*epsinf(1,2)
354 :
355 2 : if (abs(dtm) < tol6) then
356 0 : flag = 0
357 : write(message,'(a,a,a,a,a,a,a,a)')&
358 0 : & 'The determinant of the electronic dielectric tensor is zero.',ch10,&
359 0 : & 'This preludes the computation fo the EO tensor since',ch10,&
360 0 : & 'this quantity requires the inverse of epsilon.',ch10,&
361 0 : & 'Action : check you database and the value of dieflag in the input file.',ch10
362 0 : ABI_WARNING(message)
363 : end if
364 :
365 : !dieflag is required to be one since the EO tensor
366 : !requires the oscillator strengths
367 :
368 2 : if ((flag == 1).and.(dieflag==1)) then
369 :
370 : ! Factor to convert atomic units to MKS units
371 :
372 2 : fac = -16._dp*pi*pi*eps0*(Bohr_Ang**2)*1.0d-8/(e_Cb*sqrt(ucvol))
373 :
374 : ! Compute inverse of dielectric tensor
375 : ! needed to convert the nonlinear optical susceptibility tensor
376 : ! to the electrooptic tensor
377 :
378 2 : call matr3inv(epsinf,eta)
379 :
380 2 : if (iwrite) then
381 2 : write(ab_out,*)ch10
382 2 : write(ab_out,*)'Output of the EO tensor (pm/V) in Voigt notations'
383 2 : write(ab_out,*)'================================================='
384 2 : write(ab_out,*)
385 2 : if (prtmbm == 1) then
386 2 : write(ab_out,*)'Mode by mode decomposition'
387 2 : write(ab_out,*)
388 : end if
389 : end if
390 :
391 : ! Compute the ionic contribution to the EO tensor
392 :
393 8 : do imode = 4, 3*natom
394 :
395 6 : if (prtmbm == 1 .and. iwrite) then
396 6 : write(ab_out,*)
397 6 : write(ab_out,'(a4,i3,2x,a2,f7.2,a6)')'Mode',imode,' (',phfrq(imode)*Ha_cmm1,' cm-1)'
398 : end if
399 :
400 24 : do ii = 1, 3
401 78 : do jj = 1, 3
402 234 : do kk = 1, 3
403 216 : rijk(imode,ii,jj,kk) = rsus(imode,ii,jj)*fact_oscstr(1,kk,imode)/(phfrq(imode)**2)
404 : end do
405 : end do
406 : end do
407 :
408 6 : work(:,:,:) = 0._dp
409 24 : do ii = 1,3
410 78 : do jj = 1, 3
411 234 : do kk = 1, 3
412 :
413 648 : do i1 = 1, 3
414 2106 : do i2 = 1, 3
415 1944 : work(ii,jj,kk) = work(ii,jj,kk) + eta(ii,i1)*rijk(imode,i1,i2,kk)*eta(i2,jj)
416 : end do ! i2
417 : end do ! i1
418 :
419 162 : rijk(imode,ii,jj,kk) = fac*work(ii,jj,kk)
420 216 : rijk_tot(ii,jj,kk) = rijk_tot(ii,jj,kk) + rijk(imode,ii,jj,kk)
421 : end do
422 :
423 : end do
424 : end do
425 :
426 8 : if (prtmbm == 1) then
427 6 : rvoigt(:,:) = 0._dp
428 42 : do i1 = 1, 6
429 36 : ii = voigtindex(i1,1)
430 36 : jj = voigtindex(i1,2)
431 144 : do kk = 1, 3
432 144 : rvoigt(i1,kk) = (rijk(imode,ii,jj,kk) + rijk(imode,jj,ii,kk))/2._dp
433 : end do
434 42 : if (iwrite) write(ab_out,'(5x,3(2x,f16.9))')rvoigt(i1,:)
435 : end do
436 : end if
437 :
438 : end do ! imode
439 :
440 : ! Compute the electronic contribution to the EO tensor
441 :
442 2 : if (prtmbm == 1 .and. iwrite) then
443 2 : write(ab_out,*)
444 2 : write(ab_out,*)'Electronic contribution to the EO tensor'
445 : end if
446 :
447 8 : fac = 16*(pi**2)*(Bohr_Ang**2)*1.0d-8*eps0/e_Cb
448 :
449 8 : do ii = 1,3
450 26 : do jj = 1, 3
451 78 : do kk = 1, 3
452 :
453 216 : do i1 = 1, 3
454 702 : do i2 = 1, 3
455 : rijk(3*natom+1,ii,jj,kk) = rijk(3*natom+1,ii,jj,kk) + &
456 648 : & eta(ii,i1)*dchide(i1,i2,kk)*eta(i2,jj)
457 : end do ! i2
458 : end do ! i1
459 :
460 54 : rijk(3*natom+1,ii,jj,kk) = -4._dp*rijk(3*natom+1,ii,jj,kk)*fac
461 72 : rijk_tot(ii,jj,kk) = rijk_tot(ii,jj,kk) + rijk(3*natom+1,ii,jj,kk)
462 :
463 : end do
464 :
465 : end do
466 : end do
467 :
468 2 : if (prtmbm == 1) then
469 2 : rvoigt(:,:) = 0._dp
470 14 : do i1 = 1, 6
471 12 : ii = voigtindex(i1,1)
472 12 : jj = voigtindex(i1,2)
473 48 : do kk = 1, 3
474 48 : rvoigt(i1,kk) = (rijk(3*natom+1,ii,jj,kk) + rijk(3*natom+1,jj,ii,kk))/2._dp
475 : end do
476 14 : if (iwrite) write(ab_out,'(5x,3(2x,f16.9))')rvoigt(i1,:)
477 : end do
478 2 : if (iwrite) write(ab_out,*)ch10
479 : end if
480 :
481 2 : if (iwrite) write(ab_out,*)'Total EO tensor (pm/V) in Voigt notations'
482 2 : rvoigt(:,:) = 0._dp
483 14 : do i1 = 1, 6
484 12 : ii = voigtindex(i1,1)
485 12 : jj = voigtindex(i1,2)
486 48 : do kk = 1, 3
487 48 : rvoigt(i1,kk) = (rijk_tot(ii,jj,kk) + rijk_tot(jj,ii,kk))/2._dp
488 : end do
489 14 : if (iwrite) write(ab_out,'(5x,3(2x,f16.9))')rvoigt(i1,:)
490 : end do
491 :
492 : end if ! flag
493 :
494 2 : ABI_FREE(rijk)
495 2 : ABI_FREE(rijk_tot)
496 :
497 2 : end subroutine electrooptic
498 : !!***
499 :
500 : !!****f* m_raman/defwrite_nonana_raman_terms
501 : !! NAME
502 : !! defwrite_nonana_raman_terms
503 : !!
504 : !! FUNCTION
505 : !! Write the Raman susceptiblities for q-->0 along different directions in the netcdf file.
506 : !!
507 : !! INPUTS
508 : !! ncid=netcdf file id.
509 : !! iq_dir=Index of the q-point to be written to file.
510 : !! ndirs=Number of qpoints.
511 : !! rsus(3*natom,3,3)=List of Raman susceptibilities along the direction corresponding to iq_dir.
512 : !! natom=Number of atoms
513 : !!
514 : !! OUTPUT
515 : !! Only writing.
516 : !!
517 : !! SOURCE
518 :
519 6 : subroutine defwrite_nonana_raman_terms(ncid, iq_dir, ndirs, natom, rsus, mode)
520 :
521 : !Arguments ------------------------------------
522 : !scalars
523 : integer,intent(in) :: ncid,natom,iq_dir,ndirs
524 : character(len=*),intent(in) :: mode
525 : !arrays
526 : real(dp),intent(in) :: rsus(3*natom,3,3)
527 :
528 : !Local variables-------------------------------
529 : !scalars
530 : integer :: ncerr, raman_sus_varid
531 : ! *************************************************************************
532 :
533 : ! Fake use of ndirs, to keep it as argument. This should be removed when ndirs will be used.
534 : if(.false.) ncerr=ndirs
535 :
536 2 : select case (mode)
537 : case ("define")
538 2 : NCF_CHECK(nctk_def_basedims(ncid, defmode=.True.))
539 : ncerr = nctk_def_arrays(ncid, [ nctkarr_t("non_analytical_raman_sus", "dp", &
540 4 : "number_of_non_analytical_directions,number_of_phonon_modes,number_of_cartesian_directions,number_of_cartesian_directions")])
541 2 : NCF_CHECK(ncerr)
542 :
543 2 : NCF_CHECK(nctk_set_datamode(ncid))
544 :
545 : case ("write")
546 4 : NCF_CHECK(nf90_inq_varid(ncid, "non_analytical_raman_sus", raman_sus_varid))
547 36 : ncerr = nf90_put_var(ncid,raman_sus_varid,rsus, start=[iq_dir,1,1,1], count=[1,3*natom,3,3])
548 4 : NCF_CHECK(ncerr)
549 :
550 : case default
551 6 : ABI_ERROR(sjoin("Wrong value for mode", mode))
552 : end select
553 :
554 6 : end subroutine defwrite_nonana_raman_terms
555 : !!***
556 :
557 : !!****f* m_raman/defwrite_raman_terms
558 : !! NAME
559 : !! defwrite_raman_terms
560 : !!
561 : !! FUNCTION
562 : !! Write the Raman susceptiblities for q=0 and also the phonon frequncies at gamma.
563 : !!
564 : !! INPUTS
565 : !! ncid=netcdf file id.
566 : !! rsus(3*natom,3,3)=List of Raman susceptibilities.
567 : !! natom=Number of atoms
568 : !!
569 : !! OUTPUT
570 : !! Only writing.
571 : !!
572 : !! SOURCE
573 :
574 2 : subroutine defwrite_raman_terms(ncid, natom, rsus, phfrq)
575 :
576 : !Arguments ------------------------------------
577 : !scalars
578 : integer,intent(in) :: ncid,natom
579 : !arrays
580 : real(dp),intent(in) :: rsus(3*natom,3,3)
581 : real(dp),intent(in) :: phfrq(3*natom)
582 :
583 : !Local variables-------------------------------
584 : !scalars
585 : integer :: ncerr, raman_sus_varid, phmodes_varid
586 : ! *************************************************************************
587 :
588 2 : NCF_CHECK(nctk_def_basedims(ncid, defmode=.True.))
589 : ncerr = nctk_def_arrays(ncid, [ nctkarr_t("raman_sus", "dp", &
590 : "number_of_phonon_modes,number_of_cartesian_directions,number_of_cartesian_directions"), &
591 6 : nctkarr_t("gamma_phonon_modes", "dp", "number_of_phonon_modes")])
592 2 : NCF_CHECK(ncerr)
593 :
594 2 : NCF_CHECK(nctk_set_datamode(ncid))
595 :
596 2 : NCF_CHECK(nf90_inq_varid(ncid, "raman_sus", raman_sus_varid))
597 2 : NCF_CHECK(nf90_put_var(ncid,raman_sus_varid,rsus))
598 2 : NCF_CHECK(nf90_inq_varid(ncid, "gamma_phonon_modes", phmodes_varid))
599 14 : NCF_CHECK(nf90_put_var(ncid,phmodes_varid,phfrq*Ha_eV))
600 :
601 2 : end subroutine defwrite_raman_terms
602 : !!***
603 :
604 : end module m_raman
605 : !!***
|