Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 33 - (show 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 /*
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 #include "utility_lattice_reduction/put_Selling_reduced_lattice.hh"
33 #include "lattice_symmetry/VCLatticeFigureOfMeritToCheckSymmetry.hh"
34 #include "lattice_symmetry/ReducedLatticeToCheckEquiv.hh"
35 #include "zerror_type/error_out.hh"
36 #include "zlog/zlog.hh"
37 #include "ControlParam.hh"
38 #include "utility_func/stopx.hh"
39 #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 for(Int4 i=0; i<NUM_LS; i++)
47 {
48 OutputSymmetry[i] = false;
49 JudgeSymmetry[i] = false;
50 }
51
52 m_resol = 0.0;
53 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 void SortingLattice::setParam(const ControlParam& cont)
66 {
67 OutputSymmetry[(size_t)Triclinic] = cont.putOutputSymmetry(Triclinic);
68 JudgeSymmetry[(size_t)Triclinic] = false;
69 for(Int4 i=1; i<NUM_LS; i++)
70 {
71 OutputSymmetry[i] = cont.putOutputSymmetry(eBravaisType(i));
72 JudgeSymmetry[i] = cont.putOutputSymmetry(eBravaisType(i));
73 }
74
75 if( JudgeSymmetry[(size_t)Cubic_P] )
76 {
77 JudgeSymmetry[(size_t)Tetragonal_P] = true;
78 }
79 if( JudgeSymmetry[(size_t)Hexagonal] )
80 {
81 JudgeSymmetry[(size_t)Monoclinic_P] = true;
82 }
83 if( JudgeSymmetry[(size_t)Tetragonal_P] )
84 {
85 JudgeSymmetry[(size_t)Orthorhombic_P] = true;
86 }
87 if( JudgeSymmetry[(size_t)Orthorhombic_P] )
88 {
89 JudgeSymmetry[(size_t)Monoclinic_P] = true;
90 }
91
92 if( JudgeSymmetry[(size_t)Orthorhombic_C] )
93 {
94 JudgeSymmetry[(size_t)Monoclinic_B] = true;
95 }
96
97 if( JudgeSymmetry[(size_t)Cubic_I] )
98 {
99 JudgeSymmetry[(size_t)Tetragonal_I] = true;
100 }
101 if( JudgeSymmetry[(size_t)Tetragonal_I] )
102 {
103 JudgeSymmetry[(size_t)Orthorhombic_I] = true;
104 }
105
106 if( JudgeSymmetry[(size_t)Cubic_F] )
107 {
108 JudgeSymmetry[(size_t)Orthorhombic_F] = true;
109 }
110
111 m_resol = cont.putResolution();
112 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 void SortingLattice::putCentringTypes(const ReducedVCLatticeToCheckBravais& RLCB,
132 const VCLatticeFigureOfMeritToCheckSymmetry& lattice_original,
133 const BravaisType& brat,
134 vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result) const
135 {
136 lattice_result.clear();
137
138 const map< SymMat<VCData>, NRMat<Int4> >& S_red_tray = RLCB.checkCentringType(brat);
139 if( S_red_tray.empty() ) return;
140
141 // The lattice of RLCB has at least the symmetry given by eblat.
142 SymMat<VCData> S_super(4);
143 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 S_super = transform_sym_matrix(it->second, it->first);
148 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 if( !put_Selling_reduced_dim_less_than_4(S_super, trans_mat) )
152 {
153 assert( false );
154 }
155 moveSmallerDiagonalLeftUpper(S_super, trans_mat);
156
157 lattice_result.push_back( VCLatticeFigureOfMeritToCheckSymmetry( brat, SymMat43_VCData(it->first, mprod(trans_mat, it->second) ),
158 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 vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_tri) const
173 {
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 vector<VCLatticeFigureOfMeritToCheckSymmetry> latFOM_tray;
187
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 VCLatticeFigureOfMeritToCheckSymmetry latFOM(BravaisType( pair<eCentringType, ePointGroup>(Prim, Ci) ), S_super[n],
198 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 if( LatticeFigureOfMerit::cmpFOMWu( latFOM2, latFOM.putLatticeFigureOfMerit() ) )
215 {
216 latFOM.setLatticeFigureOfMerit(latFOM2);
217 }
218 }
219 const LatticeFigureOfMerit::SetOfFigureOfMerit& setFOM = latFOM.putLatticeFigureOfMerit().putFiguresOfMerit();
220 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 // sort( lattice_result_tri.begin(), lattice_result_tri.end() );
236 }
237
238
239 void SortingLattice::putLatticeCandidatesForEachBravaisTypes(
240 const Double& MIN_NormM,
241 const Double& MIN_RevM,
242 const Int4& MAX_SIZE,
243 const eABCaxis& abc_axis,
244 const eRHaxis& rh_axis,
245 vector<VCLatticeFigureOfMeritToCheckSymmetry> lattice_result[NUM_LS]) const
246 {
247 try{
248
249 for(Int4 i=1; i<NUM_LS; i++)
250 {
251 lattice_result[i].clear();
252 }
253 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
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 vector<VCLatticeFigureOfMeritToCheckSymmetry> latFOM_tray;
278
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 VCLatticeFigureOfMeritToCheckSymmetry& latFOM = lattice_result_tri[n];
289 latFOM.setLabel(n+1);
290
291 const ReducedVCLatticeToCheckBravais RLCB(abc_axis, rh_axis, m_DoesPrudentSymSearch, m_cv2, latFOM.putInitialSellingReducedForm() );
292
293 if( JudgeSymmetry[Monoclinic_B] )
294 {
295 putCentringTypes(RLCB, latFOM, BravaisType( put_monoclinic_b_type(abc_axis) ), latFOM_tray);
296 #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 putCentringTypes(RLCB, latFOM, BravaisType( pair<eCentringType, ePointGroup>(Inner, D2h) ), latFOM_tray);
306 #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 putCentringTypes(RLCB, latFOM, BravaisType( pair<eCentringType, ePointGroup>(Face, D2h) ), latFOM_tray);
316 #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 putCentringTypes(RLCB, latFOM, BravaisType( put_rhombohedral_type(rh_axis) ), latFOM_tray);
326 #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 latFOM.putLatticesOfHigherSymmetry(put_monoclinic_p_type(abc_axis), m_cv2, latFOM_tray);
337 #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 latFOM.putLatticesOfHigherSymmetry(D2h, m_cv2, latFOM_tray);
347 #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 sort( lattice_result_tri.begin(), lattice_result_tri.end(), VCLatticeFigureOfMeritToCheckSymmetry::cmpFOMdeWolff );
358 if( MAX_SIZE < (Int4)lattice_result_tri.size() )
359 {
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 /* 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 for(Int4 i=1; i<NUM_LS; i++)
382 {
383 if( !JudgeSymmetry[i] ) continue;
384 // sort( lattice_result[i].begin(), lattice_result[i].end() );
385
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 vector<VCLatticeFigureOfMeritToCheckSymmetry> latFOM_tray;
395
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 VCLatticeFigureOfMeritToCheckSymmetry& latFOM0 = lattice_result[i][index];
406 latFOM0.setLabel(index+1);
407
408 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 if( LatticeFigureOfMerit::cmpFOMWu( latFOM2, latFOM0.putLatticeFigureOfMerit() ) )
422 {
423 latFOM0.setLatticeFigureOfMerit(latFOM2);
424 }
425 }
426
427 const LatticeFigureOfMerit::SetOfFigureOfMerit& setFOM = latFOM0.putLatticeFigureOfMerit().putFiguresOfMerit();
428 if( setFOM.putFigureOfMeritWu() < MIN_NormM ) continue;
429 if( setFOM.putReversedFigureOfMerit() < MIN_RevM ) continue;
430
431 if( eBravaisType(i) == Monoclinic_P )
432 {
433 if( JudgeSymmetry[Hexagonal] )
434 {
435 latFOM0.putLatticesOfHigherSymmetry(D6h, m_cv2, latFOM_tray);
436 #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 else if( eBravaisType(i) == Monoclinic_B )
445 {
446 if( JudgeSymmetry[Orthorhombic_C] )
447 {
448 latFOM0.putLatticesOfHigherSymmetry(D2h, m_cv2, latFOM_tray);
449 #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 else if( eBravaisType(i) == Orthorhombic_P )
458 {
459 if( JudgeSymmetry[Tetragonal_P] )
460 {
461 latFOM0.putLatticesOfHigherSymmetry(D4h_Z, m_cv2, latFOM_tray);
462 #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 latFOM0.putLatticesOfHigherSymmetry(Oh, m_cv2, latFOM_tray);
472 #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 else if( eBravaisType(i) == Orthorhombic_I )
481 {
482 if( JudgeSymmetry[Tetragonal_I] )
483 {
484 latFOM0.putLatticesOfHigherSymmetry(D4h_Z, m_cv2, latFOM_tray);
485 #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 latFOM0.putLatticesOfHigherSymmetry(Oh, m_cv2, latFOM_tray);
495 #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 else if( eBravaisType(i) == Orthorhombic_F )
504 {
505 if( JudgeSymmetry[Cubic_F] )
506 {
507 latFOM0.putLatticesOfHigherSymmetry(Oh, m_cv2, latFOM_tray);
508 #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 sort( lattice_result[i].begin(), lattice_result[i].end(), VCLatticeFigureOfMeritToCheckSymmetry::cmpFOMdeWolff );
522 if( MAX_SIZE < (Int4)lattice_result[i].size() )
523 {
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 ZLOG_INFO( "(" + num2str( i+1 ) + ") The number of candidates for " + put_bravais_type_name(eBravaisType(i), abc_axis)
534 + " : " + 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 const Int4& MAX_SIZE,
549 const eABCaxis& abc_axis,
550 const eRHaxis& rh_axis,
551 vector<VCLatticeFigureOfMeritToCheckSymmetry> lattice_result[NUM_LS]) const
552 {
553 vector<VCLatticeFigureOfMeritToCheckSymmetry>& lattice_result_tri = lattice_result[(size_t)Triclinic];
554 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 + " are automatically removed).\n" );
559 ZLOG_INFO( "All the unit-cell parameters are being optimized by linear least squares...\n" );
560
561 //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 }
567
568
569 void SortingLattice::setNumberOfNeighbors(const eABCaxis& baxis_flag,
570 bool (*CmpFunc)(const VCLatticeFigureOfMeritToCheckSymmetry&, const VCLatticeFigureOfMeritToCheckSymmetry&),
571 vector<VCLatticeFigureOfMeritToCheckSymmetry> lattice_result[NUM_LS]) const
572 {
573
574 #ifdef _OPENMP
575 #pragma omp for
576 #endif
577 for(Int4 i=0; i<NUM_LS; i++)
578 {
579 if( !OutputSymmetry[(size_t)i] ) continue;
580
581 stable_sort( lattice_result[i].begin(), lattice_result[i].end() ); // Sort by the unit-cell volume.
582 for(vector<VCLatticeFigureOfMeritToCheckSymmetry>::iterator it=lattice_result[i].begin(); it<lattice_result[i].end(); it++)
583 {
584 it->putNumberOfLatticesInNeighborhood() = 0;
585 }
586 }
587
588 const Double coef_lower = 1.0 - m_resol*3.0;
589 const Double coef_upper = 1.0 + m_resol*3.0;
590
591 Vec_INT index_tray(put_number_of_bravais_types(), 0);
592
593 /* 2011.10.19 VIC Tamura */
594 Int4 SUM=0, LOOP_COUNTER=0;
595 for(Int4 i=0; i<NUM_LS; i++ ) { SUM += lattice_result[(size_t)i].size(); }
596
597 #ifdef _OPENMP
598 #pragma omp for
599 #endif
600 for(Int4 i=0; i<NUM_LS; i++)
601 {
602 if( !OutputSymmetry[(size_t)i] ) continue;
603
604 const size_t num_lattice = lattice_result[i].size();
605
606 for(size_t index=0; index<num_lattice; index++)
607 {
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 VCLatticeFigureOfMeritToCheckSymmetry& latFOM0 = lattice_result[i][index];
613 const LatticeFigureOfMerit& latFOM0_prim = latFOM0.putLatticeFigureOfMerit();
614 if( latFOM0.putNumberOfLatticesInNeighborhood() < 0 ) continue;
615
616 const Double& detS = latFOM0_prim.putDeterminantOfGramMatrix();
617 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
620 Int4 count=0;
621 if( i == (size_t)Triclinic )
622 {
623 const ReducedLatticeToCheckEquiv RLCS(m_resol, latFOM0_prim.putSellingReducedForm());
624 for(size_t index2=ibegin; index2<iend; index2++)
625 {
626 if( index2 == index ) continue;
627
628 VCLatticeFigureOfMeritToCheckSymmetry& latFOM2 = lattice_result[i][index2];
629 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 if( CmpFunc( latFOM2, latFOM0 ) )
636 {
637 if( latFOM2.putNumberOfLatticesInNeighborhood() >= 0 )
638 {
639 latFOM2.putNumberOfLatticesInNeighborhood() += 1;
640 count = -1;
641 break;
642 }
643 }
644 else
645 {
646 count++;
647 latFOM2.putNumberOfLatticesInNeighborhood() = -1;
648 }
649 }
650 }
651 }
652 else
653 {
654 for(size_t index2=ibegin; index2<iend; index2++)
655 {
656 if( index2 == index ) continue;
657
658 VCLatticeFigureOfMeritToCheckSymmetry& latFOM2 = lattice_result[i][index2];
659 const LatticeFigureOfMerit& latFOM2_prim = latFOM2.putLatticeFigureOfMerit();
660
661 // *it2 equals trans_mat * RLCS.m_S_super_obtuse * Transpose(trans_mat)
662 if( check_equiv_m( latFOM0_prim.putInverseOfBuergerReducedForm(), latFOM2_prim.putInverseOfBuergerReducedForm(), m_resol ) )
663 {
664 // Compare the figures of merit.
665 if( CmpFunc( latFOM2, latFOM0 ) )
666 {
667 if( latFOM2.putNumberOfLatticesInNeighborhood() >= 0 )
668 {
669 latFOM2.putNumberOfLatticesInNeighborhood() += 1;
670 count = -1;
671 break;
672 }
673 }
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 index = 0;
688 for(vector<VCLatticeFigureOfMeritToCheckSymmetry>::const_iterator it=lattice_result[i].begin(); it<lattice_result[i].end(); it++)
689 {
690 if( it->putNumberOfLatticesInNeighborhood() >= 0 ) index++;
691 }
692 }
693
694 /* 2011.10.19 VIC Tamura */
695 CHECK_INTERRUPTION();
696
697 for(Int4 i=0; i<NUM_LS; i++)
698 {
699 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 + " : " + 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