Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Conograph/trunk/src/SortingLattice.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 33 - (hide annotations) (download) (as text)
Wed Sep 7 04:38:51 2016 UTC (7 years, 6 months ago) by rtomiyasu
File MIME type: text/x-c++src
File size: 24138 byte(s)
The output format for base-centered monoclinic cells was corrected.
1 rtomiyasu 3 /*
2     * The MIT License
3    
4     Conograph (powder auto-indexing program)
5    
6     Copyright (c) <2012> <Ryoko Oishi-Tomiyasu, KEK>
7    
8     Permission is hereby granted, free of charge, to any person obtaining a copy
9     of this software and associated documentation files (the "Software"), to deal
10     in the Software without restriction, including without limitation the rights
11     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12     copies of the Software, and to permit persons to whom the Software is
13     furnished to do so, subject to the following conditions:
14    
15     The above copyright notice and this permission notice shall be included in
16     all copies or substantial portions of the Software.
17    
18     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24     THE SOFTWARE.
25     *
26     */
27     #ifdef _OPENMP
28     # include <omp.h>
29     #endif
30     #include "utility_func/chToDouble.hh"
31     #include "utility_func/transform_sym_matrix.hh"
32 rtomiyasu 25 #include "utility_lattice_reduction/put_Selling_reduced_lattice.hh"
33     #include "lattice_symmetry/VCLatticeFigureOfMeritToCheckSymmetry.hh"
34 rtomiyasu 3 #include "lattice_symmetry/ReducedLatticeToCheckEquiv.hh"
35     #include "zerror_type/error_out.hh"
36     #include "zlog/zlog.hh"
37     #include "ControlParam.hh"
38 rtomiyasu 25 #include "utility_func/stopx.hh"
39 rtomiyasu 3 #include "SortingLattice.hh"
40    
41     const bool SortingLattice::m_DoesPrudentSymSearch = false;
42     const Double SortingLattice::m_cv2 = 0.5;
43    
44     SortingLattice::SortingLattice()
45     {
46 rtomiyasu 25 for(Int4 i=0; i<NUM_LS; i++)
47 rtomiyasu 3 {
48     OutputSymmetry[i] = false;
49     JudgeSymmetry[i] = false;
50     }
51    
52 rtomiyasu 25 m_resol = 0.0;
53 rtomiyasu 3 m_num_ref_figure_of_merit = 20;
54     m_etype_peak_shift = kPeakShiftFunction_Type0;
55     m_WlengthX = 1.54056;
56     }
57    
58    
59     SortingLattice::~SortingLattice()
60     {
61     }
62    
63    
64     // Set the member variables.
65 rtomiyasu 25 void SortingLattice::setParam(const ControlParam& cont)
66 rtomiyasu 3 {
67 rtomiyasu 25 OutputSymmetry[(size_t)Triclinic] = cont.putOutputSymmetry(Triclinic);
68     JudgeSymmetry[(size_t)Triclinic] = false;
69     for(Int4 i=1; i<NUM_LS; i++)
70 rtomiyasu 3 {
71 rtomiyasu 25 OutputSymmetry[i] = cont.putOutputSymmetry(eBravaisType(i));
72     JudgeSymmetry[i] = cont.putOutputSymmetry(eBravaisType(i));
73 rtomiyasu 3 }
74    
75 rtomiyasu 25 if( JudgeSymmetry[(size_t)Cubic_P] )
76 rtomiyasu 3 {
77 rtomiyasu 25 JudgeSymmetry[(size_t)Tetragonal_P] = true;
78 rtomiyasu 3 }
79 rtomiyasu 25 if( JudgeSymmetry[(size_t)Hexagonal] )
80 rtomiyasu 3 {
81 rtomiyasu 25 JudgeSymmetry[(size_t)Monoclinic_P] = true;
82 rtomiyasu 3 }
83 rtomiyasu 25 if( JudgeSymmetry[(size_t)Tetragonal_P] )
84 rtomiyasu 3 {
85 rtomiyasu 25 JudgeSymmetry[(size_t)Orthorhombic_P] = true;
86 rtomiyasu 3 }
87 rtomiyasu 25 if( JudgeSymmetry[(size_t)Orthorhombic_P] )
88 rtomiyasu 3 {
89 rtomiyasu 25 JudgeSymmetry[(size_t)Monoclinic_P] = true;
90 rtomiyasu 3 }
91    
92 rtomiyasu 25 if( JudgeSymmetry[(size_t)Orthorhombic_C] )
93 rtomiyasu 3 {
94 rtomiyasu 25 JudgeSymmetry[(size_t)Monoclinic_B] = true;
95 rtomiyasu 3 }
96    
97 rtomiyasu 25 if( JudgeSymmetry[(size_t)Cubic_I] )
98 rtomiyasu 3 {
99 rtomiyasu 25 JudgeSymmetry[(size_t)Tetragonal_I] = true;
100 rtomiyasu 3 }
101 rtomiyasu 25 if( JudgeSymmetry[(size_t)Tetragonal_I] )
102 rtomiyasu 3 {
103 rtomiyasu 25 JudgeSymmetry[(size_t)Orthorhombic_I] = true;
104 rtomiyasu 3 }
105    
106 rtomiyasu 25 if( JudgeSymmetry[(size_t)Cubic_F] )
107 rtomiyasu 3 {
108 rtomiyasu 25 JudgeSymmetry[(size_t)Orthorhombic_F] = true;
109 rtomiyasu 3 }
110    
111 rtomiyasu 25 m_resol = cont.putResolution();
112 rtomiyasu 3 m_num_ref_figure_of_merit = cont.putNumberOfReflectionsForFigureOfMerit();
113     m_etype_peak_shift = cont.putPeakShiftFunctionType();
114     m_WlengthX = cont.putWaveLength();
115    
116     const vector<Double>& peak_shift_param_rad = cont.putPeakShiftParamRadian();
117     const Int4 param_num = peak_shift_param_rad.size();
118     assert( m_etype_peak_shift != kPeakShiftFunction_Type0 || param_num == 0 );
119     assert( m_etype_peak_shift != kPeakShiftFunction_Type1 || param_num == 1 );
120    
121     m_peak_shift_param_rad.resize(param_num);
122     for(Int4 i=0; i<param_num; i++)
123     {
124     m_peak_shift_param_rad[i] = peak_shift_param_rad[i];
125     }
126     }
127    
128    
129    
130    
131 rtomiyasu 25 void SortingLattice::putCentringTypes(const ReducedVCLatticeToCheckBravais& RLCB,
132     const VCLatticeFigureOfMeritToCheckSymmetry& lattice_original,
133 rtomiyasu 3 const BravaisType& brat,
134 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result) const
135 rtomiyasu 3 {
136     lattice_result.clear();
137 rtomiyasu 25
138     const map< SymMat<VCData>, NRMat<Int4> >& S_red_tray = RLCB.checkCentringType(brat);
139 rtomiyasu 3 if( S_red_tray.empty() ) return;
140    
141     // The lattice of RLCB has at least the symmetry given by eblat.
142 rtomiyasu 25 SymMat<VCData> S_super(4);
143 rtomiyasu 3 NRMat<Int4> trans_mat(4,3);
144    
145     for(map< SymMat<VCData>, NRMat<Int4> >::const_iterator it=S_red_tray.begin(); it!=S_red_tray.end(); it++)
146     {
147 rtomiyasu 25 S_super = transform_sym_matrix(it->second, it->first);
148 rtomiyasu 3 trans_mat = identity_matrix<Int4>(4);
149    
150     // S_super = trans_mat * it->second * it->first * Transpose(trans_mat * it->second) is Delone reduced.
151 rtomiyasu 25 if( !put_Selling_reduced_dim_less_than_4(S_super, trans_mat) )
152 rtomiyasu 3 {
153     assert( false );
154     }
155 rtomiyasu 25 moveSmallerDiagonalLeftUpper(S_super, trans_mat);
156    
157     lattice_result.push_back( VCLatticeFigureOfMeritToCheckSymmetry( brat, SymMat43_VCData(it->first, mprod(trans_mat, it->second) ),
158 rtomiyasu 3 lattice_original.putLatticeFigureOfMerit().putPeakShiftFunctionType(),
159     lattice_original.putLatticeFigureOfMerit().putWaveLength(),
160     lattice_original.putLatticeFigureOfMerit().putPeakShiftParamRadian() ) );
161     }
162     }
163    
164    
165    
166    
167    
168    
169     void SortingLattice::putLatticeCandidatesForTriclinic(const vector<SymMat43_VCData>& S_super,
170     const Double& MIN_NormM,
171     const Double& MIN_RevM,
172 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_tri) const
173 rtomiyasu 3 {
174     const Int4 num_topo = S_super.size();
175     lattice_result_tri.clear();
176    
177     /* 2011.10.19 VIC Tamura */
178     Int4 LOOP_COUNTER = 0;
179    
180     #ifdef _OPENMP
181     #pragma omp parallel
182     #endif
183     {
184     vector< VecDat3<Int4> > closest_hkl_tray;
185     vector<bool> is_cal_Q_observed_tray;
186 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry> latFOM_tray;
187 rtomiyasu 3
188     #ifdef _OPENMP
189     #pragma omp for
190     #endif
191     for(Int4 n=0; n<num_topo; n++)
192     {
193     /* 2011.10.19 VIC Tamura */
194     SET_PROGRESS(100*(LOOP_COUNTER++)/num_topo, 65, 1); // critical, but works
195     if(IS_CANSELED()) continue;
196    
197 rtomiyasu 25 VCLatticeFigureOfMeritToCheckSymmetry latFOM(BravaisType( pair<eCentringType, ePointGroup>(Prim, Ci) ), S_super[n],
198 rtomiyasu 3 m_etype_peak_shift, m_WlengthX, m_peak_shift_param_rad);
199    
200     latFOM.setFigureOfMerit(m_num_ref_figure_of_merit,
201     VCData::putPeakQData(),
202     closest_hkl_tray, is_cal_Q_observed_tray);
203    
204     LatticeFigureOfMeritZeroShift latFOM2 = latFOM.putLatticeFigureOfMerit();
205     pair<bool, ZErrorMessage> ans = latFOM2.fitLatticeParameterLinear(VCData::putPeakQData(),
206     closest_hkl_tray, is_cal_Q_observed_tray, false);
207    
208     if( ans.first )
209     {
210     assert( latFOM.putLatticeFigureOfMerit().putFiguresOfMerit().putNumberOfReflectionsForFigureOfMerit() > 0 );
211     latFOM2.setFigureOfMerit(latFOM.putLatticeFigureOfMerit().putFiguresOfMerit().putNumberOfReflectionsForFigureOfMerit(),
212     VCData::putPeakQData(),
213     closest_hkl_tray, is_cal_Q_observed_tray);
214 rtomiyasu 16 if( LatticeFigureOfMerit::cmpFOMWu( latFOM2, latFOM.putLatticeFigureOfMerit() ) )
215 rtomiyasu 3 {
216     latFOM.setLatticeFigureOfMerit(latFOM2);
217     }
218     }
219 rtomiyasu 25 const LatticeFigureOfMerit::SetOfFigureOfMerit& setFOM = latFOM.putLatticeFigureOfMerit().putFiguresOfMerit();
220 rtomiyasu 3 if( setFOM.putFigureOfMeritWu() < MIN_NormM ) continue;
221     if( setFOM.putReversedFigureOfMerit() < MIN_RevM ) continue;
222    
223     #ifdef _OPENMP
224     #pragma omp critical
225     #endif
226     {
227     lattice_result_tri.push_back( latFOM );
228     }
229     }
230     }
231    
232     /* 2011.10.19 VIC Tamura */
233     CHECK_INTERRUPTION();
234    
235 rtomiyasu 16 // sort( lattice_result_tri.begin(), lattice_result_tri.end() );
236 rtomiyasu 3 }
237    
238    
239     void SortingLattice::putLatticeCandidatesForEachBravaisTypes(
240     const Double& MIN_NormM,
241     const Double& MIN_RevM,
242 rtomiyasu 25 const Int4& MAX_SIZE,
243 rtomiyasu 3 const eABCaxis& abc_axis,
244     const eRHaxis& rh_axis,
245 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry> lattice_result[NUM_LS]) const
246 rtomiyasu 3 {
247     try{
248    
249 rtomiyasu 25 for(Int4 i=1; i<NUM_LS; i++)
250 rtomiyasu 3 {
251     lattice_result[i].clear();
252     }
253 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_tri = lattice_result[(size_t)Triclinic];
254     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_mono_P = lattice_result[(size_t)Monoclinic_P];
255     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_mono_B = lattice_result[(size_t)Monoclinic_B];
256     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_ortho_P = lattice_result[(size_t)Orthorhombic_P];
257     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_ortho_B = lattice_result[(size_t)Orthorhombic_C];
258     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_ortho_I = lattice_result[(size_t)Orthorhombic_I];
259     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_ortho_F = lattice_result[(size_t)Orthorhombic_F];
260     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_tetra_P = lattice_result[(size_t)Tetragonal_P];
261     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_tetra_I = lattice_result[(size_t)Tetragonal_I];
262     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_rhom = lattice_result[(size_t)Rhombohedral];
263     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_hex = lattice_result[(size_t)Hexagonal];
264     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_cubic_P = lattice_result[(size_t)Cubic_P];
265     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_cubic_I = lattice_result[(size_t)Cubic_I];
266     vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_cubic_F = lattice_result[(size_t)Cubic_F];
267 rtomiyasu 3
268     const Int4 num_tri = lattice_result_tri.size();
269    
270     /* 2011.10.19 VIC Tamura */
271     Int4 LOOP_COUNTER = 0;
272    
273     #ifdef _OPENMP
274     #pragma omp parallel
275     #endif
276     {
277 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry> latFOM_tray;
278 rtomiyasu 3
279     #ifdef _OPENMP
280     #pragma omp for
281     #endif
282     for(Int4 n=0; n<num_tri; n++)
283     {
284     /* 2011.10.19 VIC Tamura */
285     SET_PROGRESS(99*(LOOP_COUNTER++)/num_tri, 66, 30); // critical, but works
286     if(IS_CANSELED()) continue;
287    
288 rtomiyasu 25 VCLatticeFigureOfMeritToCheckSymmetry& latFOM = lattice_result_tri[n];
289     latFOM.setLabel(n+1);
290 rtomiyasu 3
291 rtomiyasu 25 const ReducedVCLatticeToCheckBravais RLCB(abc_axis, rh_axis, m_DoesPrudentSymSearch, m_cv2, latFOM.putInitialSellingReducedForm() );
292 rtomiyasu 3
293     if( JudgeSymmetry[Monoclinic_B] )
294     {
295 rtomiyasu 25 putCentringTypes(RLCB, latFOM, BravaisType( put_monoclinic_b_type(abc_axis) ), latFOM_tray);
296 rtomiyasu 3 #ifdef _OPENMP
297     #pragma omp critical(monoB)
298     #endif
299     {
300     lattice_result_mono_B.insert(lattice_result_mono_B.end(), latFOM_tray.begin(), latFOM_tray.end());
301     }
302     }
303     if( JudgeSymmetry[Orthorhombic_I] )
304     {
305 rtomiyasu 25 putCentringTypes(RLCB, latFOM, BravaisType( pair<eCentringType, ePointGroup>(Inner, D2h) ), latFOM_tray);
306 rtomiyasu 3 #ifdef _OPENMP
307     #pragma omp critical(orthoI)
308     #endif
309     {
310     lattice_result_ortho_I.insert(lattice_result_ortho_I.end(), latFOM_tray.begin(), latFOM_tray.end());
311     }
312     }
313     if( JudgeSymmetry[Orthorhombic_F] )
314     {
315 rtomiyasu 25 putCentringTypes(RLCB, latFOM, BravaisType( pair<eCentringType, ePointGroup>(Face, D2h) ), latFOM_tray);
316 rtomiyasu 3 #ifdef _OPENMP
317     #pragma omp critical(orthoF)
318     #endif
319     {
320     lattice_result_ortho_F.insert(lattice_result_ortho_F.end(), latFOM_tray.begin(), latFOM_tray.end());
321     }
322     }
323     if( JudgeSymmetry[Rhombohedral] )
324     {
325 rtomiyasu 25 putCentringTypes(RLCB, latFOM, BravaisType( put_rhombohedral_type(rh_axis) ), latFOM_tray);
326 rtomiyasu 3 #ifdef _OPENMP
327     #pragma omp critical(rhom)
328     #endif
329     {
330     lattice_result_rhom.insert(lattice_result_rhom.end(), latFOM_tray.begin(), latFOM_tray.end());
331     }
332     }
333    
334     if( JudgeSymmetry[Monoclinic_P] )
335     {
336 rtomiyasu 25 latFOM.putLatticesOfHigherSymmetry(put_monoclinic_p_type(abc_axis), m_cv2, latFOM_tray);
337 rtomiyasu 3 #ifdef _OPENMP
338     #pragma omp critical(monoP)
339     #endif
340     {
341     lattice_result_mono_P.insert(lattice_result_mono_P.end(), latFOM_tray.begin(), latFOM_tray.end());
342     }
343     }
344     if( JudgeSymmetry[Orthorhombic_P] )
345     {
346 rtomiyasu 25 latFOM.putLatticesOfHigherSymmetry(D2h, m_cv2, latFOM_tray);
347 rtomiyasu 3 #ifdef _OPENMP
348     #pragma omp critical (ortho_P)
349     #endif
350     {
351     lattice_result_ortho_P.insert(lattice_result_ortho_P.end(), latFOM_tray.begin(), latFOM_tray.end());
352     }
353     }
354     }
355     }
356    
357 rtomiyasu 25 sort( lattice_result_tri.begin(), lattice_result_tri.end(), VCLatticeFigureOfMeritToCheckSymmetry::cmpFOMdeWolff );
358     if( MAX_SIZE < (Int4)lattice_result_tri.size() )
359 rtomiyasu 16 {
360     lattice_result_tri.erase( lattice_result_tri.begin() + MAX_SIZE, lattice_result_tri.end() );
361     }
362    
363     const size_t num_tri2 = lattice_result_tri.size();
364     for(size_t n=0; n<num_tri2; n++)
365     {
366     lattice_result_tri[n].setLabel(n+1);
367     }
368    
369     ZLOG_INFO( "The program has selected " + num2str<Int4>( lattice_result_tri.size() )
370     + " triclinic solutions using the Wu figure of merit.\n\n" );
371    
372    
373 rtomiyasu 3 /* 2011.10.19 VIC Tamura */
374     CHECK_INTERRUPTION();
375    
376     /* 2011.10.19 VIC Tamura */
377     LOOP_COUNTER = 0;
378     Int4 SUM = 0;
379     for(Int4 i=0; i<NUM_LS; i++) { SUM += lattice_result[i].size(); }
380    
381 rtomiyasu 25 for(Int4 i=1; i<NUM_LS; i++)
382 rtomiyasu 3 {
383     if( !JudgeSymmetry[i] ) continue;
384 rtomiyasu 16 // sort( lattice_result[i].begin(), lattice_result[i].end() );
385 rtomiyasu 3
386     const Int4 num_lattice = lattice_result[i].size();
387    
388     #ifdef _OPENMP
389     #pragma omp parallel
390     #endif
391     {
392     vector< VecDat3<Int4> > closest_hkl_tray;
393     vector<bool> is_cal_Q_observed_tray;
394 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry> latFOM_tray;
395 rtomiyasu 3
396     #ifdef _OPENMP
397     #pragma omp for
398     #endif
399     for(Int4 index=0; index<num_lattice; index++)
400     {
401     /* 2011.10.19 VIC Tamura */
402     SET_PROGRESS(99+1*(LOOP_COUNTER++)/SUM, 66, 30); // critical, but works
403     if(IS_CANSELED()) continue;
404    
405 rtomiyasu 25 VCLatticeFigureOfMeritToCheckSymmetry& latFOM0 = lattice_result[i][index];
406     latFOM0.setLabel(index+1);
407    
408 rtomiyasu 3 latFOM0.setFigureOfMerit(m_num_ref_figure_of_merit,
409     VCData::putPeakQData(),
410     closest_hkl_tray, is_cal_Q_observed_tray);
411    
412     LatticeFigureOfMeritZeroShift latFOM2 = latFOM0.putLatticeFigureOfMerit();
413     pair<bool, ZErrorMessage> ans = latFOM2.fitLatticeParameterLinear(VCData::putPeakQData(),
414     closest_hkl_tray, is_cal_Q_observed_tray, false);
415     if( ans.first )
416     {
417     assert( latFOM0.putLatticeFigureOfMerit().putFiguresOfMerit().putNumberOfReflectionsForFigureOfMerit() > 0 );
418     latFOM2.setFigureOfMerit(latFOM0.putLatticeFigureOfMerit().putFiguresOfMerit().putNumberOfReflectionsForFigureOfMerit(),
419     VCData::putPeakQData(),
420     closest_hkl_tray, is_cal_Q_observed_tray);
421 rtomiyasu 16 if( LatticeFigureOfMerit::cmpFOMWu( latFOM2, latFOM0.putLatticeFigureOfMerit() ) )
422 rtomiyasu 3 {
423     latFOM0.setLatticeFigureOfMerit(latFOM2);
424     }
425     }
426    
427 rtomiyasu 25 const LatticeFigureOfMerit::SetOfFigureOfMerit& setFOM = latFOM0.putLatticeFigureOfMerit().putFiguresOfMerit();
428 rtomiyasu 3 if( setFOM.putFigureOfMeritWu() < MIN_NormM ) continue;
429     if( setFOM.putReversedFigureOfMerit() < MIN_RevM ) continue;
430    
431 rtomiyasu 25 if( eBravaisType(i) == Monoclinic_P )
432 rtomiyasu 3 {
433     if( JudgeSymmetry[Hexagonal] )
434     {
435 rtomiyasu 25 latFOM0.putLatticesOfHigherSymmetry(D6h, m_cv2, latFOM_tray);
436 rtomiyasu 3 #ifdef _OPENMP
437     #pragma omp critical (hex)
438     #endif
439     {
440     lattice_result_hex.insert(lattice_result_hex.end(), latFOM_tray.begin(), latFOM_tray.end());
441     }
442     }
443     }
444 rtomiyasu 25 else if( eBravaisType(i) == Monoclinic_B )
445 rtomiyasu 3 {
446     if( JudgeSymmetry[Orthorhombic_C] )
447     {
448 rtomiyasu 25 latFOM0.putLatticesOfHigherSymmetry(D2h, m_cv2, latFOM_tray);
449 rtomiyasu 3 #ifdef _OPENMP
450     #pragma omp critical (ortho_B)
451     #endif
452     {
453     lattice_result_ortho_B.insert(lattice_result_ortho_B.end(), latFOM_tray.begin(), latFOM_tray.end());
454     }
455     }
456     }
457 rtomiyasu 25 else if( eBravaisType(i) == Orthorhombic_P )
458 rtomiyasu 3 {
459     if( JudgeSymmetry[Tetragonal_P] )
460     {
461 rtomiyasu 25 latFOM0.putLatticesOfHigherSymmetry(D4h_Z, m_cv2, latFOM_tray);
462 rtomiyasu 3 #ifdef _OPENMP
463     #pragma omp critical (tetra_P)
464     #endif
465     {
466     lattice_result_tetra_P.insert(lattice_result_tetra_P.end(), latFOM_tray.begin(), latFOM_tray.end());
467     }
468     }
469     if( JudgeSymmetry[Cubic_P] )
470     {
471 rtomiyasu 25 latFOM0.putLatticesOfHigherSymmetry(Oh, m_cv2, latFOM_tray);
472 rtomiyasu 3 #ifdef _OPENMP
473     #pragma omp critical (cubic_P)
474     #endif
475     {
476     lattice_result_cubic_P.insert(lattice_result_cubic_P.end(), latFOM_tray.begin(), latFOM_tray.end());
477     }
478     }
479     }
480 rtomiyasu 25 else if( eBravaisType(i) == Orthorhombic_I )
481 rtomiyasu 3 {
482     if( JudgeSymmetry[Tetragonal_I] )
483     {
484 rtomiyasu 25 latFOM0.putLatticesOfHigherSymmetry(D4h_Z, m_cv2, latFOM_tray);
485 rtomiyasu 3 #ifdef _OPENMP
486     #pragma omp critical (tetra_I)
487     #endif
488     {
489     lattice_result_tetra_I.insert(lattice_result_tetra_I.end(), latFOM_tray.begin(), latFOM_tray.end());
490     }
491     }
492     if( JudgeSymmetry[Cubic_I] )
493     {
494 rtomiyasu 25 latFOM0.putLatticesOfHigherSymmetry(Oh, m_cv2, latFOM_tray);
495 rtomiyasu 3 #ifdef _OPENMP
496     #pragma omp critical (cubic_I)
497     #endif
498     {
499     lattice_result_cubic_I.insert(lattice_result_cubic_I.end(), latFOM_tray.begin(), latFOM_tray.end());
500     }
501     }
502     }
503 rtomiyasu 25 else if( eBravaisType(i) == Orthorhombic_F )
504 rtomiyasu 3 {
505     if( JudgeSymmetry[Cubic_F] )
506     {
507 rtomiyasu 25 latFOM0.putLatticesOfHigherSymmetry(Oh, m_cv2, latFOM_tray);
508 rtomiyasu 3 #ifdef _OPENMP
509     #pragma omp critical (cubic_F)
510     #endif
511     {
512     lattice_result_cubic_F.insert(lattice_result_cubic_F.end(), latFOM_tray.begin(), latFOM_tray.end());
513     }
514     }
515     }
516     }
517     }
518     /* 2011.10.19 VIC Tamura */
519     CHECK_INTERRUPTION();
520    
521 rtomiyasu 25 sort( lattice_result[i].begin(), lattice_result[i].end(), VCLatticeFigureOfMeritToCheckSymmetry::cmpFOMdeWolff );
522     if( MAX_SIZE < (Int4)lattice_result[i].size() )
523 rtomiyasu 16 {
524     lattice_result[i].erase( lattice_result[i].begin() + MAX_SIZE, lattice_result[i].end() );
525     }
526    
527     const size_t num_lattice2 = lattice_result[i].size();
528     for(size_t n=0; n<num_lattice2; n++)
529     {
530     lattice_result[i][n].setLabel(n+1);
531     }
532    
533 rtomiyasu 25 ZLOG_INFO( "(" + num2str( i+1 ) + ") The number of candidates for " + put_bravais_type_name(eBravaisType(i), abc_axis)
534 rtomiyasu 3 + " : " + num2str<Int4>( lattice_result[i].size() ) + "\n" );
535     }
536     ZLOG_INFO( "\n" );
537     }
538     catch(bad_alloc& ball)
539     {
540     throw nerror(ball, __FILE__, __LINE__, __FUNCTION__);
541     }
542     }
543    
544    
545     void SortingLattice::putLatticeCandidatesForEachBravaisTypes(const vector<SymMat43_VCData>& S_super,
546     const Double& MIN_NormM,
547     const Double& MIN_RevM,
548 rtomiyasu 25 const Int4& MAX_SIZE,
549 rtomiyasu 3 const eABCaxis& abc_axis,
550     const eRHaxis& rh_axis,
551 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry> lattice_result[NUM_LS]) const
552 rtomiyasu 3 {
553 rtomiyasu 25 vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_tri = lattice_result[(size_t)Triclinic];
554 rtomiyasu 3 putLatticeCandidatesForTriclinic(S_super, MIN_NormM, MIN_RevM, lattice_result_tri);
555    
556     ZLOG_INFO( "Determination of the Bravais type is being carried out...\n(Solutions with " + putLabel(SCWuM) + " less than " + num2str(MIN_NormM)
557     + " or " + putLabel(SCRevM) + " less than " + num2str(MIN_RevM)
558 rtomiyasu 16 + " are automatically removed).\n" );
559     ZLOG_INFO( "All the unit-cell parameters are being optimized by linear least squares...\n" );
560 rtomiyasu 3
561 rtomiyasu 16 //ZLOG_INFO( "The program has removed " + num2str<Int4>( S_super.size() - lattice_result_tri.size() )
562     // + " triclinic solutions because their " + putLabel(SCWuM) + " is less than " + num2str(MIN_NormM)
563     // + " or their " + putLabel(SCRevM) + " is less than " + num2str(MIN_RevM) + ".\n\n" );
564     //ZLOG_INFO( "Determination of the Bravais type is being carried out...\n" );
565     putLatticeCandidatesForEachBravaisTypes(MIN_NormM, MIN_RevM, MAX_SIZE, abc_axis, rh_axis, lattice_result);
566 rtomiyasu 3 }
567    
568    
569     void SortingLattice::setNumberOfNeighbors(const eABCaxis& baxis_flag,
570 rtomiyasu 25 bool (*CmpFunc)(const VCLatticeFigureOfMeritToCheckSymmetry&, const VCLatticeFigureOfMeritToCheckSymmetry&),
571     vector<VCLatticeFigureOfMeritToCheckSymmetry> lattice_result[NUM_LS]) const
572 rtomiyasu 3 {
573    
574     #ifdef _OPENMP
575     #pragma omp for
576     #endif
577 rtomiyasu 25 for(Int4 i=0; i<NUM_LS; i++)
578 rtomiyasu 3 {
579 rtomiyasu 25 if( !OutputSymmetry[(size_t)i] ) continue;
580 rtomiyasu 3
581     stable_sort( lattice_result[i].begin(), lattice_result[i].end() ); // Sort by the unit-cell volume.
582 rtomiyasu 25 for(vector<VCLatticeFigureOfMeritToCheckSymmetry>::iterator it=lattice_result[i].begin(); it<lattice_result[i].end(); it++)
583 rtomiyasu 3 {
584     it->putNumberOfLatticesInNeighborhood() = 0;
585     }
586     }
587    
588 rtomiyasu 25 const Double coef_lower = 1.0 - m_resol*3.0;
589     const Double coef_upper = 1.0 + m_resol*3.0;
590 rtomiyasu 3
591 rtomiyasu 25 Vec_INT index_tray(put_number_of_bravais_types(), 0);
592 rtomiyasu 3
593     /* 2011.10.19 VIC Tamura */
594     Int4 SUM=0, LOOP_COUNTER=0;
595 rtomiyasu 25 for(Int4 i=0; i<NUM_LS; i++ ) { SUM += lattice_result[(size_t)i].size(); }
596 rtomiyasu 3
597     #ifdef _OPENMP
598     #pragma omp for
599     #endif
600 rtomiyasu 25 for(Int4 i=0; i<NUM_LS; i++)
601 rtomiyasu 3 {
602 rtomiyasu 25 if( !OutputSymmetry[(size_t)i] ) continue;
603 rtomiyasu 3
604 rtomiyasu 25 const size_t num_lattice = lattice_result[i].size();
605 rtomiyasu 3
606 rtomiyasu 25 for(size_t index=0; index<num_lattice; index++)
607 rtomiyasu 3 {
608     /* 2011.10.19 VIC Tamura */
609     SET_PROGRESS(100*(LOOP_COUNTER++)/SUM, 97, 1); // critical, but works
610     if(IS_CANSELED()) continue;
611    
612 rtomiyasu 25 VCLatticeFigureOfMeritToCheckSymmetry& latFOM0 = lattice_result[i][index];
613 rtomiyasu 3 const LatticeFigureOfMerit& latFOM0_prim = latFOM0.putLatticeFigureOfMerit();
614     if( latFOM0.putNumberOfLatticesInNeighborhood() < 0 ) continue;
615    
616     const Double& detS = latFOM0_prim.putDeterminantOfGramMatrix();
617 rtomiyasu 25 const size_t ibegin = distance( lattice_result[i].begin(), lower_bound( lattice_result[i].begin(), lattice_result[i].end(), detS*coef_lower ) );
618     const size_t iend = distance( lattice_result[i].begin(), upper_bound( lattice_result[i].begin()+ibegin, lattice_result[i].end(), detS*coef_upper ) );
619 rtomiyasu 3
620     Int4 count=0;
621 rtomiyasu 25 if( i == (size_t)Triclinic )
622 rtomiyasu 3 {
623 rtomiyasu 25 const ReducedLatticeToCheckEquiv RLCS(m_resol, latFOM0_prim.putSellingReducedForm());
624     for(size_t index2=ibegin; index2<iend; index2++)
625 rtomiyasu 3 {
626     if( index2 == index ) continue;
627    
628 rtomiyasu 25 VCLatticeFigureOfMeritToCheckSymmetry& latFOM2 = lattice_result[i][index2];
629 rtomiyasu 3 const LatticeFigureOfMerit& latFOM2_prim = latFOM2.putLatticeFigureOfMerit();
630    
631     // lattice_result_tri[index2] equals trans_mat * RLCB.m_S_super_obtuse * Transpose(trans_mat)
632     if( RLCS.equiv( latFOM2_prim.putSellingReducedForm() ) )
633     {
634     // Compare the figures of merit.
635 rtomiyasu 16 if( CmpFunc( latFOM2, latFOM0 ) )
636 rtomiyasu 3 {
637 rtomiyasu 16 if( latFOM2.putNumberOfLatticesInNeighborhood() >= 0 )
638     {
639 rtomiyasu 25 latFOM2.putNumberOfLatticesInNeighborhood() += 1;
640 rtomiyasu 16 count = -1;
641     break;
642     }
643 rtomiyasu 3 }
644     else
645     {
646     count++;
647     latFOM2.putNumberOfLatticesInNeighborhood() = -1;
648     }
649     }
650     }
651     }
652     else
653     {
654 rtomiyasu 25 for(size_t index2=ibegin; index2<iend; index2++)
655 rtomiyasu 3 {
656     if( index2 == index ) continue;
657    
658 rtomiyasu 25 VCLatticeFigureOfMeritToCheckSymmetry& latFOM2 = lattice_result[i][index2];
659 rtomiyasu 3 const LatticeFigureOfMerit& latFOM2_prim = latFOM2.putLatticeFigureOfMerit();
660    
661     // *it2 equals trans_mat * RLCS.m_S_super_obtuse * Transpose(trans_mat)
662 rtomiyasu 25 if( check_equiv_m( latFOM0_prim.putInverseOfBuergerReducedForm(), latFOM2_prim.putInverseOfBuergerReducedForm(), m_resol ) )
663 rtomiyasu 3 {
664     // Compare the figures of merit.
665 rtomiyasu 16 if( CmpFunc( latFOM2, latFOM0 ) )
666 rtomiyasu 3 {
667 rtomiyasu 16 if( latFOM2.putNumberOfLatticesInNeighborhood() >= 0 )
668     {
669 rtomiyasu 25 latFOM2.putNumberOfLatticesInNeighborhood() += 1;
670 rtomiyasu 16 count = -1;
671     break;
672     }
673 rtomiyasu 3 }
674     else
675     {
676     count++;
677     latFOM2.putNumberOfLatticesInNeighborhood() = -1;
678     }
679     }
680     }
681     }
682    
683     latFOM0.putNumberOfLatticesInNeighborhood() = count;
684     }
685    
686     Int4& index = index_tray[i];
687 rtomiyasu 16 index = 0;
688 rtomiyasu 25 for(vector<VCLatticeFigureOfMeritToCheckSymmetry>::const_iterator it=lattice_result[i].begin(); it<lattice_result[i].end(); it++)
689 rtomiyasu 3 {
690     if( it->putNumberOfLatticesInNeighborhood() >= 0 ) index++;
691     }
692     }
693    
694     /* 2011.10.19 VIC Tamura */
695     CHECK_INTERRUPTION();
696    
697 rtomiyasu 25 for(Int4 i=0; i<NUM_LS; i++)
698 rtomiyasu 3 {
699 rtomiyasu 25 if( !OutputSymmetry[(size_t)i] ) continue;
700     ZLOG_INFO( "(" + num2str( i+1 ) + ") The number of candidates for " + put_bravais_type_name(eBravaisType(i), baxis_flag)
701 rtomiyasu 3 + " : " + num2str( lattice_result[i].size() ) + " -> " + num2str( index_tray[i] ) + "\n" );
702     }
703     ZLOG_INFO( "\n" );
704     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26