Commit Graph

109 Commits

Author SHA1 Message Date
degironc 3e6b4f8e76 MAJOR restructuring of the FFTXlib library
In real space processors are organized in a 2D pattern.

Each processor owns data from a sub-set of Z-planes and a sub-set of Y-planes.
In reciprocal space each processor owns Z-columns that belong to a sub set of
X-values. This allows to split the processors in two sets for communication
in the YZ and XY planes.
In alternative, if the situation allows for it, a task group paralelization is used
(with ntg=nyfft) where complete XY planes of ntg wavefunctions are collected and Fourier
trasnformed in G space by different task-groups. This is preferable to the Z-proc + Y-proc
paralleization if task group can be used because a smaller number of larger ammounts of 
data are transferred. Hence three types of fft are implemented: 
 
  !
  !! ... isgn = +-1 : parallel 3d fft for rho and for the potential
  !
  !! ... isgn = +-2 : parallel 3d fft for wavefunctions
  !
  !! ... isgn = +-3 : parallel 3d fft for wavefunctions with task group
  !
  !! ... isgn = +   : G-space to R-space, output = \sum_G f(G)exp(+iG*R)
  !! ...              fft along z using pencils        (cft_1z)
  !! ...              transpose across nodes           (fft_scatter_yz)
  !! ...              fft along y using pencils        (cft_1y)
  !! ...              transpose across nodes           (fft_scatter_xy)
  !! ...              fft along x using pencils        (cft_1x)
  !
  !! ... isgn = -   : R-space to G-space, output = \int_R f(R)exp(-iG*R)/Omega
  !! ...              fft along x using pencils        (cft_1x)
  !! ...              transpose across nodes           (fft_scatter_xy)
  !! ...              fft along y using pencils        (cft_1y)
  !! ...              transpose across nodes           (fft_scatter_yz)
  !! ...              fft along z using pencils        (cft_1z)
  !
  ! If task_group_fft_is_active the FFT acts on a number of wfcs equal to 
  ! dfft%nproc2, the number of Y-sections in which a plane is divided. 
  ! Data are reshuffled by the fft_scatter_tg routine so that each of the 
  ! dfft%nproc2 subgroups (made by dfft%nproc3 procs) deals with whole planes 
  ! of a single wavefunciton.
  !

fft_type module heavily modified, a number of variables renamed with more intuitive names 
(at least to me), a number of more variables introduced for the Y-proc parallelization.

Task_group module made void. task_group management is now reduced to the logical component
 fft_desc%have_task_groups of fft_type_descriptor type variable fft_desc.

In term of interfaces, the 'easy' calling sequences are

SUBROUTINE invfft/fwfft( grid_type, f, dfft, howmany )

  !! where:
  !! 
  !! **grid_type = 'Dense'** : 
  !!   inverse/direct fourier transform of potentials and charge density f
  !!   on the dense grid (dfftp). On output, f is overwritten
  !! 
  !! **grid_type = 'Smooth'** :
  !!   inverse/direct fourier transform of  potentials and charge density f
  !!   on the smooth grid (dffts). On output, f is overwritten
  !! 
  !! **grid_type = 'Wave'** :
  !!   inverse/direct fourier transform of  wave functions f
  !!   on the smooth grid (dffts). On output, f is overwritten
  !!
  !! **grid_type = 'tgWave'** :
  !!   inverse/direct fourier transform of  wave functions f with task group
  !!   on the smooth grid (dffts). On output, f is overwritten
  !!
  !! **grid_type = 'Custom'** : 
  !!   inverse/direct fourier transform of potentials and charge density f
  !!   on a custom grid (dfft_exx). On output, f is overwritten
  !! 
  !! **grid_type = 'CustomWave'** :
  !!   inverse/direct fourier transform of  wave functions f
  !!   on a custom grid (dfft_exx). On output, f is overwritten
  !! 
  !! **dfft = FFT descriptor**, IMPORTANT NOTICE: grid is specified only by dfft.
  !!   No check is performed on the correspondence between dfft and grid_type.
  !!   grid_type is now used only to distinguish cases 'Wave' / 'CustomWave' 
  !!   from all other cases
                                                                                                 

Many more files modified.




git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13676 c92efa57-630b-4861-b058-cf58834340f0
2017-08-01 20:31:02 +00:00
pietrodelugas 3419a47f1a added LAXlib to the include path of LR_modules
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13656 c92efa57-630b-4861-b058-cf58834340f0
2017-07-30 19:56:06 +00:00
degironc 7fd27ba0ad UtilXlib directory created to contain a library (libutil.a) for
basic operations: error handling, timing clocks, interfaces to basic mpi 
calls, find free units...
These routines are moved from Modules and dependencies to other modules
are removed. 

MANY files are updated to comply with the move.



git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13629 c92efa57-630b-4861-b058-cf58834340f0
2017-07-26 11:15:20 +00:00
degironc e1d6b18de9 more changes at the smmothing of beta- and q-funcions
US variable qq renamed qq_nt and a new variable qq_na added
because in real space the integral may depend (slightly) on
the atomic position and an atomic value is needed to compute
exactly normalizable wfc.  
Whenever realspace tricks are not used  qq_nt is used.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13604 c92efa57-630b-4861-b058-cf58834340f0
2017-07-15 23:16:18 +00:00
giannozz 23a32c1d5f Believe it or not, CMPLX(0.d0,0.d0) /= (0.d0,0.d0) : the latter is a double
precision complex, the former is a single precision complex. Not a big deal, 
since we use only complex 0 or 1 or i for which there is no loss of precision.
Note however that CMPLX(a,0.d0) with "a" double precision real, or CMPLX(a,b)
are single-precision complex, and this can introduce loss of precision.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13314 c92efa57-630b-4861-b058-cf58834340f0
2017-02-17 13:11:41 +00:00
giannozz 56892d0f7a Cleanup of unused variables
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13268 c92efa57-630b-4861-b058-cf58834340f0
2017-01-23 15:46:28 +00:00
giannozz f86660892c Some harmonization of old and new tetrahedra:
- old routine computing dos, allocation and deallocation of "tetra" moved into
  module ktetra; variables tetra and ntetra are used only inside the module
- added module variable nntetra containing number of neighboring points used
  (20 for optimized tetrahedra, 4 otherwise)


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13228 c92efa57-630b-4861-b058-cf58834340f0
2017-01-08 14:14:38 +00:00
giannozz 435e3fae31 Optimized tetrahedra for DFPT, contributed by Mitsuaki Kawamura
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13210 c92efa57-630b-4861-b058-cf58834340f0
2016-12-23 12:49:16 +00:00
giannozz 3dce174c0d Module "ktetra" taken out of pwcom.f90 in view of some additions coming.
Variable "ltetra" moved to common "klist" together with all other variables
setting occupations. All make.depend updated. Should be harmless.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13204 c92efa57-630b-4861-b058-cf58834340f0
2016-12-21 14:23:06 +00:00
giannozz 3722216d93 Unused routine h_psiq removed
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@13100 c92efa57-630b-4861-b058-cf58834340f0
2016-10-09 20:36:06 +00:00
spigafi 46bfd84dc4 fdef preprocessor macro refactoring (LR_Modules)
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12971 c92efa57-630b-4861-b058-cf58834340f0
2016-09-17 14:36:58 +00:00
spigafi 533c8119e0 Horror, statements longer than 132 characters. Fixed!
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12953 c92efa57-630b-4861-b058-cf58834340f0
2016-09-11 15:00:41 +00:00
giannozz 9426c337f1 Oops ...
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12895 c92efa57-630b-4861-b058-cf58834340f0
2016-08-31 18:30:15 +00:00
giannozz 22848786c6 Updated i-PI interface, minimal documentation, updates to make.depend files
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12852 c92efa57-630b-4861-b058-cf58834340f0
2016-08-26 16:08:25 +00:00
ccavazzoni 8f777555f3 - adding "howmany" parameter to the cfft3d subroutine,
to compute many FFTs at the same time, particularly usefull for EXX
  but could be usefule for many linear response code as well
  (for the time being implemented only for DFTI and internal FFTW,
  should be trivial to extend other drivers)
- more clean-ups


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12815 c92efa57-630b-4861-b058-cf58834340f0
2016-08-19 22:55:53 +00:00
ccavazzoni 43b253226c - logical flag have_task_groups removed from FFT type.
- FFT type now do not have any information about task group:
  no need to temporary change the value of variable...
- When task group are not needed symple do not use "dtgs" data type
- FFT interfaces called with FFT datatype ONLY, do not perform
  task groups trics any longer, this should simply thing a bit....




git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12628 c92efa57-630b-4861-b058-cf58834340f0
2016-07-29 16:37:19 +00:00
ccavazzoni de2a01c4e6 - Task groups variables moved form FFT type to a new data type
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12626 c92efa57-630b-4861-b058-cf58834340f0
2016-07-29 14:25:22 +00:00
degironc 18dc5b3bd1 routine upf_to_internal modified so that for USPP we set the augmentation charge as an
l-dependent array in all cases.
 This is already the case when upf%tpawp or upf%q_with_l are .true. .
 For vanderbilt US pseudos, where nqf and rinner are non zero, we do here what otherwise
 would be done multiple times in many parts of the code (such as in init_us_1, addusforce_r, 
 bp_calc_btq, compute_qdipol) whenever the q_l(r) were to be constructed. 
 For simple rrkj3 pseudos we duplicate the infomation contained in q(r) for all q_l(r).

 This requires a little extra memory but unifies the treatment of q_l(r) and allows further 
 tweaking with the augmentation charge.

 Variable upf%q_with_l set .true. at the end of the operation. It would be better to leave the 
 variable untouched at its input value  and modify the routines that compute q_l(r) to just use
 the now always present upf%qfuncl array  but this is the first step before some cleanup.

 setqf.f90 moved from PW/src to Modules, Makefiles and dependencies updated




git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12591 c92efa57-630b-4861-b058-cf58834340f0
2016-07-20 11:42:37 +00:00
giannozz 02ce4df8d6 make.sys => make.inc. All other codes using make.sys should modify their build
mechanism accordingly.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12539 c92efa57-630b-4861-b058-cf58834340f0
2016-06-25 07:26:50 +00:00
giannozz 9363f19ec5 Global variable "eprec" no longer useful, deleted
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12512 c92efa57-630b-4861-b058-cf58834340f0
2016-06-21 10:50:51 +00:00
giannozz e9e86b48af Routine computing preconditioning matrix made more general and self-contained.
Initial computation and storage of "eprec" to be deleted.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12510 c92efa57-630b-4861-b058-cf58834340f0
2016-06-21 08:23:33 +00:00
giannozz 6ca4dc2f55 There was a line in previous commit that wasn't supposed to be there
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12507 c92efa57-630b-4861-b058-cf58834340f0
2016-06-19 12:46:20 +00:00
giannozz 424f5e19d5 Preconditioning for phonon extracted - can be improved and generalized
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12506 c92efa57-630b-4861-b058-cf58834340f0
2016-06-19 12:44:09 +00:00
timrov 7e4e1d9228 Upgrade of the TDDFPT codes using the new logic of the global indices igk_k(1:3,ik) and ngk(ik).
More specificaly:
1) Remove global variable npw (from wvfct) and use ngk(ik) (for optical TDDFPT codes) 
   or ngk(ikk) with ikk=ikks(ik) (for turboEELS). In some routines, ngk is assigned to
   the local variable npw, i.e. npw=ngk(ik), and in other routines ngk is used directly.
2) Remove global indices igk(1:3) (from wvfct) and use igk_k(1:3,ik) (for optical TDDFPT codes)
   or igk_k(1:3,ikk) with ikk=ikks(ik) (for turboEELS).
3) Remove global variable npwq (from qpoint) and use the local variable with the same name,
   which is defined as npwq=ngk(ikq) with ikq=ikqs(ik) (i.e. index of the point k+q).
4) Remove global index variable igkq(1:3) (from qpoint) and use the global index variable
   igk_k(1:3,ikq) with ikq=ikqs(ik).


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12487 c92efa57-630b-4861-b058-cf58834340f0
2016-06-12 17:26:36 +00:00
giannozz 86a67ebed8 More removal of I/O of indices
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12464 c92efa57-630b-4861-b058-cf58834340f0
2016-06-04 20:18:02 +00:00
giannozz 0299c8ed2a Missing intialization to 0 of nbnd_occ after recent changes
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12463 c92efa57-630b-4861-b058-cf58834340f0
2016-06-04 16:46:12 +00:00
giannozz 0e6d449bea Statically dimensioned vector "nbnd_occ" made dynamical.
BEWARE: I think I have modified all codes that needed it, but please
1) verify that both allocation and deallocation are made in the proper place
2) update other codes not under svn that make usage of such variable


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12451 c92efa57-630b-4861-b058-cf58834340f0
2016-06-01 08:30:58 +00:00
giannozz 0014bec604 Call to cft_wave changed so as to remove need to pass indices. Note that this
will break any code not in svn using cft_wave. Should work but please check.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12449 c92efa57-630b-4861-b058-cf58834340f0
2016-05-30 17:39:48 +00:00
giannozz c032fa57a9 Minor cleanup: harmonization of indices
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12444 c92efa57-630b-4861-b058-cf58834340f0
2016-05-30 13:43:23 +00:00
timrov 44f00cb28c Since the routine h_psi should be used also in the linear-response codes (instead of h_psiq), I use it in the turboEELS code. More precisely, I call directly the routine ch_psi_all instead of calling h_psiq and s_psi in the routine TDDFPT/lr_apply_liouvillian_eels. Added some clarification comments. Lastly, in the routine ch_psi_all I added a condition "IF (alpha_pv.NE.0.0d0) THEN compute alpha_pv P_v wfct", which allows one to avoid computing P_v when alpha_pv=0 (e.g. in the turboEELS code).
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12442 c92efa57-630b-4861-b058-cf58834340f0
2016-05-30 09:53:34 +00:00
giannozz 1127d9009b I think that there is no reason any longer to use a custom version of H\psi
for finite-q perturbations: we may use the "official" version of h_psi.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12441 c92efa57-630b-4861-b058-cf58834340f0
2016-05-29 14:38:38 +00:00
giannozz cabca0a6be Recently introduced and no longer needed hack removed. Cleanup: it is not a
good idea to call "h_psi" a routine that does something related to but 
different from H\psi. Corrected a few grossly wrong comments.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12440 c92efa57-630b-4861-b058-cf58834340f0
2016-05-28 20:36:34 +00:00
timrov ef4a28ff1a Several changes:
1) Moved some TDDFPT-specific cases from the general routine LR_Modules/ch_psi_all.f90 to the TDDFPT routines;
2) Deleted the variable "tddfpt", because it is no longer needed anywhere (in the older versions of the code this variable was used to tell to the PHonon routines about TDDFPT specific operations);
3) Some other minor changes in TDDFPT.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12432 c92efa57-630b-4861-b058-cf58834340f0
2016-05-25 17:49:25 +00:00
giannozz 56817ff93f More cleanup of k+G indices: almost all occurrences of k-point dependent "igk"
variables deleted; almost all occurrences of "npw" made local (PW and PP only)
Variable "current_k" must be set before calling h_psi (as before, although it
was used only in some cases). All changes should be safe, but testing of PP 
and PH is very limited.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12428 c92efa57-630b-4861-b058-cf58834340f0
2016-05-23 16:00:53 +00:00
timrov ef8089e87b Put the routine dv_of_drho in the module (called dv_of_drho_lr), because it contains an optional array drhoc (response core charge density). Without putting dv_of_drho in the module, the code was stopping (if it was compiled with the XLF compiler (on BG/Q)) when making a check "if (add_nlcc .and. .not.present(drhoc))" in the routine dv_of_drho. Thanks to Lorenzo Paulatto and Paolo Giannozzi for the discussions about how to solve this bug!
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12414 c92efa57-630b-4861-b058-cf58834340f0
2016-05-17 13:58:51 +00:00
sponce 40a8127377 Splitting of the program dynmat.f90.
All of its subroutines and module have been transfered into LR_Modules/dynmat_sub.f90.
This will allow the subroutines to be re-used by other programs. 
Note: I had to rename the subroutine "readmat" into "readmat2" because of 
      another readmat subroutine in PHonon/PH/elphon.f90.



git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12386 c92efa57-630b-4861-b058-cf58834340f0
2016-05-04 15:31:48 +00:00
giannozz df30a665aa Explicit preprocessing produces *_tmp.f90 files instead of *.F90 files, to
prevent trouble with OS-X. May or may not work (it won't unless configure
is updated: please somebody with v.2.63 of autoconf do it), may turn out to
be obsolete anyway.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12364 c92efa57-630b-4861-b058-cf58834340f0
2016-04-27 14:53:38 +00:00
giannozz a528fc89f3 More small fixes for NAG compiler, by Samuel Ponce'
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12308 c92efa57-630b-4861-b058-cf58834340f0
2016-04-14 17:39:49 +00:00
degironc fd25445b20 cleanup: gfortran correctly crashes at the first assignement of a couple of never allocated,
never-used-again arrays.



git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12300 c92efa57-630b-4861-b058-cf58834340f0
2016-04-11 19:52:07 +00:00
degironc 325cbc8490 gfortran complains for a few too long lines
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12299 c92efa57-630b-4861-b058-cf58834340f0
2016-04-11 18:07:08 +00:00
degironc d7e9274e82 cleanup of commented debubbing printouts
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12297 c92efa57-630b-4861-b058-cf58834340f0
2016-04-11 16:19:09 +00:00
degironc 4bd82d234d phonon with vdW-DF/vdw-DF2/rVV10 added.
make.depend updated


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12296 c92efa57-630b-4861-b058-cf58834340f0
2016-04-11 15:40:37 +00:00
timrov 63376b343b Added a missing part in the routine setup_alpha_pv.f90, which was taken from PH. This was a bug for metals (because one variable was not set up, i.e. emax), which I introduced by mistake a few weeks ago while moving some parts of the PH code to LR_Modules. Sorry about this!
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12293 c92efa57-630b-4861-b058-cf58834340f0
2016-04-11 09:12:52 +00:00
timrov 613ee5577a Several changes:
1) Added a flag dpsi_computed in the subroutine orthogonalize.f90 in LR_Modules. The meaning of this flag is described in the header of that routine. It was needed to generalize this subroutine. In short, this flag controls whether S*evq was already computed before or it must be computed inside of orthogonalize. If this idea does not look good for someone, then a better strategy should be found. I decided to introduce this new flag in order to make minimal changes in the PHonon code. 
2) TDDFPT: The use of lr_ortho (which is a modified version of orthogonalize.f90) was replaced in several places by orthogonalize. Still in several places of the turboDavidson code there are calls to lr_ortho, which should be replaced by orthogonalize if possible. In the future lr_ortho should be removed and orthogonalize should be used instead. This is done for the sake of unification of the linear response codes in QE.
3) TDDFPT: The orthogonalization to the valence states manifold (orthogonalize) has been moved from lr_lanczos to lr_apply_liouvillian, which is now in correspondance with the definition of the Liouvillian superoperator implemented in lr_apply_liouvillian. USPP is a special case, and hence the property S^-1 P_c^+ = P_c S^-1 has been used to make such a move of the call to orthogonalize (old call to lr_ortho).


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12225 c92efa57-630b-4861-b058-cf58834340f0
2016-03-19 19:04:05 +00:00
timrov 01bf571bd4 The TDDFPT module is no longer dependent on PHonon. All the dependencies were moved to LR_Modules.
Further reunification of TDDFPT with the routines in LR_Modules can and should be done.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12183 c92efa57-630b-4861-b058-cf58834340f0
2016-02-28 15:47:13 +00:00
timrov f68259ade0 Deleting the old copy of setqmod.f90 from PHonon
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12182 c92efa57-630b-4861-b058-cf58834340f0
2016-02-28 14:07:43 +00:00
timrov fe47e747a2 Copying the routine setqmod.f90 from PHonon/PH to LR_Modules
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12181 c92efa57-630b-4861-b058-cf58834340f0
2016-02-28 14:04:50 +00:00
timrov fe77de94f8 Deleting old copies of qdipol_cryst.f90 and adddvepsi_us.f90 in PHonon, and
updating Makefile and make.depend.


git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12178 c92efa57-630b-4861-b058-cf58834340f0
2016-02-28 13:42:43 +00:00
timrov 51c90520fa Copying the routine adddvepsi_us.f90 from PHonon/PH to LR_Modules
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12177 c92efa57-630b-4861-b058-cf58834340f0
2016-02-28 13:10:52 +00:00
timrov 0c1a84aefa Copying the routine qdipol_cryst.f90 from PHonon/PH to LR_Modules
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12176 c92efa57-630b-4861-b058-cf58834340f0
2016-02-28 13:09:03 +00:00