51#include "applications/staticProps/BOPofR.hpp"
52#include "applications/staticProps/BondAngleDistribution.hpp"
53#include "applications/staticProps/BondOrderParameter.hpp"
54#include "applications/staticProps/DensityPlot.hpp"
55#include "applications/staticProps/GofAngle2.hpp"
56#include "applications/staticProps/GofR.hpp"
57#include "applications/staticProps/GofRAngle.hpp"
58#include "applications/staticProps/GofRAngle2.hpp"
59#include "applications/staticProps/GofRZ.hpp"
60#include "applications/staticProps/GofXyz.hpp"
61#include "applications/staticProps/GofZ.hpp"
62#include "applications/staticProps/KirkwoodBuff.hpp"
63#include "applications/staticProps/NanoLength.hpp"
64#include "applications/staticProps/NanoVolume.hpp"
65#include "applications/staticProps/ObjectCount.hpp"
66#include "applications/staticProps/P2OrderParameter.hpp"
67#include "applications/staticProps/P2R.hpp"
68#include "applications/staticProps/PipeDensity.hpp"
69#include "applications/staticProps/RhoZ.hpp"
70#include "applications/staticProps/RippleOP.hpp"
71#include "applications/staticProps/SCDOrderParameter.hpp"
72#include "applications/staticProps/StaticAnalyser.hpp"
73#include "applications/staticProps/TwoDGofR.hpp"
74#include "applications/staticProps/pAngle.hpp"
78#include "utils/simError.h"
79#if defined(HAVE_FFTW_H) || defined(HAVE_DFFTW_H) || defined(HAVE_FFTW3_H)
80#include "applications/staticProps/Hxy.hpp"
82#include "applications/staticProps/AngleR.hpp"
83#include "applications/staticProps/ChargeDensityZ.hpp"
84#include "applications/staticProps/ChargeHistogram.hpp"
85#include "applications/staticProps/ChargeR.hpp"
86#include "applications/staticProps/ChargeZ.hpp"
87#include "applications/staticProps/CoordinationNumber.hpp"
88#include "applications/staticProps/CurrentDensity.hpp"
89#include "applications/staticProps/DensityHistogram.hpp"
90#include "applications/staticProps/DipoleOrientation.hpp"
91#include "applications/staticProps/Field.hpp"
92#include "applications/staticProps/HBondGeometric.hpp"
93#include "applications/staticProps/HBondR.hpp"
94#include "applications/staticProps/HBondRvol.hpp"
95#include "applications/staticProps/HBondZ.hpp"
96#include "applications/staticProps/HBondZvol.hpp"
97#include "applications/staticProps/Kirkwood.hpp"
98#include "applications/staticProps/MassDensityR.hpp"
99#include "applications/staticProps/MassDensityZ.hpp"
100#include "applications/staticProps/MomentumHistogram.hpp"
101#include "applications/staticProps/MultipoleSum.hpp"
102#include "applications/staticProps/NitrileFrequencyMap.hpp"
103#include "applications/staticProps/NumberR.hpp"
104#include "applications/staticProps/NumberZ.hpp"
105#include "applications/staticProps/OrderParameterProbZ.hpp"
106#include "applications/staticProps/PositionZ.hpp"
108#include "applications/staticProps/RNEMDStats.hpp"
109#include "applications/staticProps/RhoR.hpp"
110#include "applications/staticProps/SurfaceDiffusion.hpp"
111#include "applications/staticProps/TetrahedralityHBMatrix.hpp"
112#include "applications/staticProps/TetrahedralityParam.hpp"
113#include "applications/staticProps/TetrahedralityParamDens.hpp"
114#include "applications/staticProps/TetrahedralityParamR.hpp"
115#include "applications/staticProps/TetrahedralityParamXYZ.hpp"
116#include "applications/staticProps/TetrahedralityParamZ.hpp"
117#include "applications/staticProps/VelocityZ.hpp"
121int main(
int argc,
char* argv[]) {
125 if (cmdline_parser(argc, argv, &args_info) != 0) { exit(1); }
128 std::string dumpFileName = args_info.input_arg;
137 if (args_info.sele1_given) {
138 sele1 = args_info.sele1_arg;
140 char* sele1Env = getenv(
"SELECTION1");
144 sele1 =
"select all";
151 if (args_info.sele2_given) {
152 sele2 = args_info.sele2_arg;
154 char* sele2Env = getenv(
"SELECTION2");
167 if (args_info.sele3_given) sele3 = args_info.sele3_arg;
172 if (args_info.comsele_given) comsele = args_info.comsele_arg;
174 bool batchMode(
false);
175 if (args_info.scd_given) {
176 if (args_info.sele1_given && args_info.sele2_given &&
177 args_info.sele3_given) {
179 }
else if (args_info.molname_given && args_info.begin_given &&
180 args_info.end_given) {
181 if (args_info.begin_arg < 0 || args_info.end_arg < 0 ||
182 args_info.begin_arg > args_info.end_arg - 2) {
183 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
184 "below conditions are not satisfied:\n"
185 "0 <= begin && 0<= end && begin <= end-2\n");
186 painCave.severity = OPENMD_ERROR;
187 painCave.isFatal = 1;
192 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
193 "either --sele1, --sele2, --sele3 are specified,"
194 " or --molname, --begin, --end are specified\n");
195 painCave.severity = OPENMD_ERROR;
196 painCave.isFatal = 1;
203 SimInfo* info = creator.createSim(dumpFileName);
214 switch (args_info.privilegedAxis_arg) {
215 case privilegedAxis_arg_x:
218 case privilegedAxis_arg_y:
221 case privilegedAxis_arg_z:
228 switch (args_info.privilegedAxis2_arg) {
229 case privilegedAxis2_arg_x:
232 case privilegedAxis2_arg_y:
235 case privilegedAxis2_arg_z:
242 RealType zmaxLen(0.0);
243 if (args_info.length_given) {
244 maxLen = args_info.length_arg;
245 if (args_info.zlength_given) { zmaxLen = args_info.zlength_arg; }
250 maxLen = std::min(std::min(hmat(0, 0), hmat(1, 1)), hmat(2, 2)) / 2.0;
252 zmaxLen = hmat(privilegedAxis, privilegedAxis);
255 int nanglebins, nrbins;
257 if (args_info.nrbins_given) {
258 nrbins = args_info.nrbins_arg;
260 nrbins = args_info.nbins_arg;
263 if (args_info.nanglebins_given) {
264 nanglebins = args_info.nanglebins_arg;
266 nanglebins = args_info.nbins_arg;
269 RealType binWidth = args_info.binWidth_arg;
273 if (args_info.v_radius_given) {
274 vRadius = args_info.v_radius_arg;
280 switch (args_info.momentum_arg) {
291 switch (args_info.component_arg) {
292 case component_arg_x:
295 case component_arg_y:
298 case component_arg_z:
304 std::unique_ptr<StaticAnalyser> analyser {
nullptr};
306 if (args_info.gofr_given) {
307 analyser = std::make_unique<GofR>(info, dumpFileName, sele1, sele2, maxLen,
309 }
else if (args_info.gofz_given) {
311 std::make_unique<GofZ>(info, dumpFileName, sele1, sele2, maxLen,
312 zmaxLen, args_info.nbins_arg, privilegedAxis);
313 }
else if (args_info.r_z_given) {
314 analyser = std::make_unique<GofRZ>(info, dumpFileName, sele1, sele2, maxLen,
315 zmaxLen, nrbins, args_info.nbins_z_arg,
317 }
else if (args_info.r_theta_given) {
318 if (args_info.sele3_given)
319 analyser = std::make_unique<GofRTheta>(info, dumpFileName, sele1, sele2,
320 sele3, maxLen, nrbins, nanglebins);
322 analyser = std::make_unique<GofRTheta>(info, dumpFileName, sele1, sele2,
323 maxLen, nrbins, nanglebins);
324 }
else if (args_info.r_omega_given) {
325 if (args_info.sele3_given)
326 analyser = std::make_unique<GofROmega>(info, dumpFileName, sele1, sele2,
327 sele3, maxLen, nrbins, nanglebins);
329 analyser = std::make_unique<GofROmega>(info, dumpFileName, sele1, sele2,
330 maxLen, nrbins, nanglebins);
331 }
else if (args_info.theta_omega_given) {
332 if (args_info.sele3_given)
333 analyser = std::make_unique<GofAngle2>(info, dumpFileName, sele1, sele2,
336 analyser = std::make_unique<GofAngle2>(info, dumpFileName, sele1, sele2,
338 }
else if (args_info.r_theta_omega_given) {
339 if (args_info.sele3_given)
340 analyser = std::make_unique<GofRAngle2>(
341 info, dumpFileName, sele1, sele2, sele3, maxLen, nrbins, nanglebins);
343 analyser = std::make_unique<GofRAngle2>(info, dumpFileName, sele1, sele2,
344 maxLen, nrbins, nanglebins);
345 }
else if (args_info.gxyz_given) {
346 if (args_info.refsele_given) {
347 analyser = std::make_unique<GofXyz>(info, dumpFileName, sele1, sele2,
348 args_info.refsele_arg, maxLen,
349 args_info.nbins_arg);
351 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
352 "--refsele must set when --gxyz is used");
353 painCave.severity = OPENMD_ERROR;
354 painCave.isFatal = 1;
357 }
else if (args_info.twodgofr_given) {
358 if (args_info.dz_given) {
359 analyser = std::make_unique<TwoDGofR>(info, dumpFileName, sele1, sele2,
360 maxLen, args_info.dz_arg, nrbins);
362 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
363 "A slab width (dz) must be specified when calculating TwoDGofR");
364 painCave.severity = OPENMD_ERROR;
365 painCave.isFatal = 1;
368 }
else if (args_info.kirkwood_buff_given) {
369 if (args_info.sele1_given && args_info.sele2_given) {
370 analyser = std::make_unique<KirkwoodBuff>(info, dumpFileName, sele1,
371 sele2, maxLen, nrbins);
374 painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
375 "Two selection scripts (--sele1 and --sele2) must be specified when "
376 "calculating Kirkwood Buff integrals");
377 painCave.severity = OPENMD_ERROR;
378 painCave.isFatal = 1;
381 }
else if (args_info.p2_given) {
382 if (args_info.sele1_given) {
383 if (args_info.sele2_given) {
384 analyser = std::make_unique<P2OrderParameter>(info, dumpFileName, sele1,
386 }
else if (args_info.seleoffset_given) {
387 analyser = std::make_unique<P2OrderParameter>(info, dumpFileName, sele1,
388 args_info.seleoffset_arg);
391 std::make_unique<P2OrderParameter>(info, dumpFileName, sele1);
394 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
395 "At least one selection script (--sele1) must be specified when "
396 "calculating P2 order parameters");
397 painCave.severity = OPENMD_ERROR;
398 painCave.isFatal = 1;
401 }
else if (args_info.rp2_given) {
402 analyser = std::make_unique<RippleOP>(info, dumpFileName, sele1, sele2);
403 }
else if (args_info.bo_given) {
404 if (args_info.rcut_given) {
405 analyser = std::make_unique<BondOrderParameter>(
406 info, dumpFileName, sele1, args_info.rcut_arg, args_info.nbins_arg);
408 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
409 "A cutoff radius (rcut) must be specified when calculating Bond "
412 painCave.severity = OPENMD_ERROR;
413 painCave.isFatal = 1;
416 }
else if (args_info.multipole_given) {
417 analyser = std::make_unique<MultipoleSum>(info, dumpFileName, sele1, maxLen,
418 args_info.nbins_arg);
420 }
else if (args_info.tet_param_given) {
421 if (args_info.rcut_given) {
422 analyser = std::make_unique<TetrahedralityParam>(
423 info, dumpFileName, sele1, args_info.rcut_arg, args_info.nbins_arg);
425 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
426 "A cutoff radius (rcut) must be specified when calculating "
429 painCave.severity = OPENMD_ERROR;
430 painCave.isFatal = 1;
433 }
else if (args_info.tet_param_z_given) {
434 if (args_info.rcut_given) {
435 analyser = std::make_unique<TetrahedralityParamZ>(
436 info, dumpFileName, sele1, sele2, args_info.rcut_arg,
437 args_info.nbins_arg, privilegedAxis);
439 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
440 "A cutoff radius (rcut) must be specified when calculating "
443 painCave.severity = OPENMD_ERROR;
444 painCave.isFatal = 1;
447 }
else if (args_info.tet_param_r_given) {
448 if (args_info.rcut_given) {
449 if (args_info.sele3_given) {
450 analyser = std::make_unique<TetrahedralityParamR>(
451 info, dumpFileName, sele1, sele2, sele3, args_info.rcut_arg, maxLen,
454 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
455 "Selection3 (--sele3) must be given when calculating "
456 "Tetrahedrality Parameter Qk(r)");
457 painCave.severity = OPENMD_ERROR;
458 painCave.isFatal = 1;
462 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
463 "A cutoff radius (rcut) must be specified when calculating "
466 painCave.severity = OPENMD_ERROR;
467 painCave.isFatal = 1;
470 }
else if (args_info.tet_param_dens_given) {
471 if (args_info.rcut_given) {
472 analyser = std::make_unique<TetrahedralityParamDens>(
473 info, dumpFileName, sele1, sele2, args_info.rcut_arg,
474 args_info.nbins_arg);
476 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
477 "A cutoff radius (rcut) must be specified when calculating "
480 painCave.severity = OPENMD_ERROR;
481 painCave.isFatal = 1;
484 }
else if (args_info.tet_hb_given) {
485 if (args_info.rcut_given) {
486 analyser = std::make_unique<TetrahedralityHBMatrix>(
487 info, dumpFileName, sele1, args_info.rcut_arg, args_info.OOcut_arg,
488 args_info.thetacut_arg, args_info.OHcut_arg, args_info.nbins_arg);
490 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
491 "A cutoff radius (rcut) must be specified when calculating "
492 " Tetrahedrality Hydrogen Bonding Matrix");
493 painCave.severity = OPENMD_ERROR;
494 painCave.isFatal = 1;
497 }
else if (args_info.tet_param_xyz_given) {
498 if (!args_info.rcut_given) {
499 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
500 "A cutoff radius (rcut) must be specified when calculating"
501 " Tetrahedrality Parameters");
502 painCave.severity = OPENMD_ERROR;
503 painCave.isFatal = 1;
506 if (!args_info.voxelSize_given) {
507 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
508 "A voxel size must be specified when calculating"
509 " volume-resolved Tetrahedrality Parameters");
510 painCave.severity = OPENMD_ERROR;
511 painCave.isFatal = 1;
514 if (!args_info.gaussWidth_given) {
515 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
516 "A gaussian width must be specified when calculating"
517 " volume-resolved Tetrahedrality Parameters");
518 painCave.severity = OPENMD_ERROR;
519 painCave.isFatal = 1;
522 analyser = std::make_unique<TetrahedralityParamXYZ>(
523 info, dumpFileName, sele1, sele2, args_info.rcut_arg,
524 args_info.voxelSize_arg, args_info.gaussWidth_arg);
525 }
else if (args_info.ior_given) {
526 if (args_info.rcut_given) {
527 analyser = std::make_unique<IcosahedralOfR>(
528 info, dumpFileName, sele1, args_info.rcut_arg, nrbins, maxLen);
530 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
531 "A cutoff radius (rcut) must be specified when calculating Bond "
534 painCave.severity = OPENMD_ERROR;
535 painCave.isFatal = 1;
538 }
else if (args_info.for_given) {
539 if (args_info.rcut_given) {
540 analyser = std::make_unique<FCCOfR>(info, dumpFileName, sele1,
541 args_info.rcut_arg, nrbins, maxLen);
543 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
544 "A cutoff radius (rcut) must be specified when calculating Bond "
547 painCave.severity = OPENMD_ERROR;
548 painCave.isFatal = 1;
551 }
else if (args_info.bad_given) {
552 if (args_info.rcut_given) {
553 analyser = std::make_unique<BondAngleDistribution>(
554 info, dumpFileName, sele1, args_info.rcut_arg, args_info.nbins_arg);
556 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
557 "A cutoff radius (rcut) must be specified when calculating Bond "
560 painCave.severity = OPENMD_ERROR;
561 painCave.isFatal = 1;
564 }
else if (args_info.scd_given) {
566 analyser = std::make_unique<SCDOrderParameter>(
567 info, dumpFileName, args_info.molname_arg, args_info.begin_arg,
570 analyser = std::make_unique<SCDOrderParameter>(info, dumpFileName, sele1,
573 }
else if (args_info.density_given) {
574 analyser = std::make_unique<DensityPlot>(info, dumpFileName, sele1, sele2,
575 maxLen, args_info.nbins_arg);
576 }
else if (args_info.count_given) {
577 analyser = std::make_unique<ObjectCount>(info, dumpFileName, sele1);
578 }
else if (args_info.slab_density_given) {
579 analyser = std::make_unique<RhoZ>(info, dumpFileName, sele1,
580 args_info.nbins_arg, privilegedAxis);
581 }
else if (args_info.eam_density_given) {
582 analyser = std::make_unique<DensityHistogram>(info, dumpFileName, sele1,
583 args_info.nbins_arg);
584 }
else if (args_info.momentum_distribution_given) {
585 analyser = std::make_unique<MomentumHistogram>(
586 info, dumpFileName, sele1, args_info.nbins_arg, momentum_type,
588 }
else if (args_info.net_charge_given) {
589 analyser = std::make_unique<ChargeHistogram>(info, dumpFileName, sele1,
590 args_info.nbins_arg);
591 }
else if (args_info.current_density_given) {
592 analyser = std::make_unique<CurrentDensity>(
593 info, dumpFileName, sele1, args_info.nbins_arg, privilegedAxis);
594 }
else if (args_info.chargez_given) {
595 analyser = std::make_unique<ChargeZ>(info, dumpFileName, sele1,
596 args_info.nbins_arg, privilegedAxis);
597 }
else if (args_info.charger_given) {
598 analyser = std::make_unique<ChargeR>(info, dumpFileName, sele1, maxLen,
599 args_info.nbins_arg);
600 }
else if (args_info.numberz_given) {
601 analyser = std::make_unique<NumberZ>(info, dumpFileName, sele1,
602 args_info.nbins_arg, privilegedAxis);
603 }
else if (args_info.numberr_given) {
604 analyser = std::make_unique<NumberR>(info, dumpFileName, sele1, maxLen,
605 args_info.nbins_arg);
606 }
else if (args_info.massdensityz_given) {
607 analyser = std::make_unique<MassDensityZ>(
608 info, dumpFileName, sele1, args_info.nbins_arg, privilegedAxis);
609 }
else if (args_info.massdensityr_given) {
610 analyser = std::make_unique<MassDensityR>(info, dumpFileName, sele1, maxLen,
611 args_info.nbins_arg);
612 }
else if (args_info.charge_density_z_given) {
613 analyser = std::make_unique<ChargeDensityZ>(
614 info, dumpFileName, sele1, args_info.nbins_arg, vRadius,
615 args_info.atom_name_arg, args_info.gen_xyz_flag, privilegedAxis);
616 }
else if (args_info.countz_given) {
617 analyser = std::make_unique<PositionZ>(info, dumpFileName, sele1,
618 args_info.nbins_arg, privilegedAxis);
619 }
else if (args_info.pipe_density_given) {
620 switch (privilegedAxis) {
622 analyser = std::make_unique<PipeDensity>(
623 info, dumpFileName, sele1, args_info.nbins_y_arg,
624 args_info.nbins_z_arg, privilegedAxis);
627 analyser = std::make_unique<PipeDensity>(
628 info, dumpFileName, sele1, args_info.nbins_z_arg,
629 args_info.nbins_x_arg, privilegedAxis);
633 analyser = std::make_unique<PipeDensity>(
634 info, dumpFileName, sele1, args_info.nbins_x_arg,
635 args_info.nbins_y_arg, privilegedAxis);
638 }
else if (args_info.rnemdz_given) {
639 analyser = std::make_unique<RNEMDZ>(info, dumpFileName, sele1,
640 args_info.nbins_arg, privilegedAxis);
641 }
else if (args_info.rnemdr_given) {
642 analyser = std::make_unique<RNEMDR>(info, dumpFileName, sele1, comsele,
644 }
else if (args_info.rnemdrt_given) {
645 analyser = std::make_unique<RNEMDRTheta>(info, dumpFileName, sele1, comsele,
646 nrbins, binWidth, nanglebins);
647 }
else if (args_info.nitrile_given) {
648 analyser = std::make_unique<NitrileFrequencyMap>(info, dumpFileName, sele1,
649 args_info.nbins_arg);
650 }
else if (args_info.p_angle_given) {
651 if (args_info.sele1_given) {
652 if (args_info.sele2_given)
653 analyser = std::make_unique<pAngle>(info, dumpFileName, sele1, sele2,
654 args_info.nbins_arg);
655 else if (args_info.seleoffset_given) {
656 if (args_info.seleoffset2_given) {
657 analyser = std::make_unique<pAngle>(
658 info, dumpFileName, sele1, args_info.seleoffset_arg,
659 args_info.seleoffset2_arg, args_info.nbins_arg);
661 analyser = std::make_unique<pAngle>(info, dumpFileName, sele1,
662 args_info.seleoffset_arg,
663 args_info.nbins_arg);
666 analyser = std::make_unique<pAngle>(info, dumpFileName, sele1,
667 args_info.nbins_arg);
669 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
670 "At least one selection script (--sele1) must be specified when "
671 "calculating P(angle) distributions");
672 painCave.severity = OPENMD_ERROR;
673 painCave.isFatal = 1;
676#if defined(HAVE_FFTW_H) || defined(HAVE_DFFTW_H) || defined(HAVE_FFTW3_H)
677 }
else if (args_info.hxy_given) {
678 analyser = std::make_unique<Hxy>(
679 info, dumpFileName, sele1, args_info.nbins_x_arg, args_info.nbins_y_arg,
680 args_info.nbins_z_arg, args_info.nbins_arg);
682 }
else if (args_info.cn_given || args_info.scn_given || args_info.gcn_given) {
683 if (args_info.rcut_given) {
684 if (args_info.cn_given) {
685 analyser = std::make_unique<CoordinationNumber>(
686 info, dumpFileName, sele1, sele2, args_info.rcut_arg,
687 args_info.nbins_arg);
688 }
else if (args_info.scn_given) {
690 std::make_unique<SCN>(info, dumpFileName, sele1, sele2,
691 args_info.rcut_arg, args_info.nbins_arg);
692 }
else if (args_info.gcn_given) {
694 std::make_unique<GCN>(info, dumpFileName, sele1, sele2,
695 args_info.rcut_arg, args_info.nbins_arg);
698 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
699 "A cutoff radius (rcut) must be specified when calculating\n"
700 "\t Coordination Numbers");
701 painCave.severity = OPENMD_ERROR;
702 painCave.isFatal = 1;
705 }
else if (args_info.surfDiffusion_given) {
707 std::make_unique<SurfaceDiffusion>(info, dumpFileName, sele1, maxLen);
708 }
else if (args_info.rho_r_given) {
709 if (args_info.radius_given) {
710 analyser = std::make_unique<RhoR>(info, dumpFileName, sele1, maxLen,
711 nrbins, args_info.radius_arg);
713 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
714 "A particle radius (radius) must be specified when calculating "
716 painCave.severity = OPENMD_ERROR;
717 painCave.isFatal = 1;
720 }
else if (args_info.hullvol_given) {
721 analyser = std::make_unique<NanoVolume>(info, dumpFileName, sele1);
722 }
else if (args_info.rodlength_given) {
723 analyser = std::make_unique<NanoLength>(info, dumpFileName, sele1);
724 }
else if (args_info.angle_r_given) {
725 if (args_info.sele1_given) {
726 if (args_info.sele2_given)
727 analyser = std::make_unique<AngleR>(info, dumpFileName, sele1, sele2,
729 else if (args_info.seleoffset_given) {
730 if (args_info.seleoffset2_given) {
731 analyser = std::make_unique<AngleR>(
732 info, dumpFileName, sele1, args_info.seleoffset_arg,
733 args_info.seleoffset2_arg, maxLen, nrbins);
735 analyser = std::make_unique<AngleR>(info, dumpFileName, sele1,
736 args_info.seleoffset_arg, maxLen,
741 std::make_unique<AngleR>(info, dumpFileName, sele1, maxLen, nrbins);
743 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
744 "At least one selection script (--sele1) must be specified when "
745 "calculating Angle(r) values");
746 painCave.severity = OPENMD_ERROR;
747 painCave.isFatal = 1;
750 }
else if (args_info.p2r_given) {
751 if (args_info.sele1_given) {
752 if (args_info.sele2_given)
753 analyser = std::make_unique<P2R>(info, dumpFileName, sele1, sele2,
754 args_info.nbins_arg);
755 else if (args_info.seleoffset_given) {
756 if (args_info.seleoffset2_given) {
757 analyser = std::make_unique<P2R>(
758 info, dumpFileName, sele1, args_info.seleoffset_arg,
759 args_info.seleoffset2_arg, args_info.nbins_arg);
761 analyser = std::make_unique<P2R>(info, dumpFileName, sele1,
762 args_info.seleoffset_arg,
763 args_info.nbins_arg);
766 analyser = std::make_unique<P2R>(info, dumpFileName, sele1,
767 args_info.nbins_arg);
769 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
770 "At least one selection script (--sele1) must be specified when "
771 "calculating P2R values");
772 painCave.severity = OPENMD_ERROR;
773 painCave.isFatal = 1;
776 }
else if (args_info.hbond_given) {
777 if (args_info.rcut_given) {
778 if (args_info.thetacut_given) {
779 analyser = std::make_unique<HBondGeometric>(
780 info, dumpFileName, sele1, sele2, args_info.rcut_arg,
781 args_info.thetacut_arg, args_info.nbins_arg);
783 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
784 "A cutoff angle (thetacut) must be specified when calculating "
786 "Bonding Statistics");
787 painCave.severity = OPENMD_ERROR;
788 painCave.isFatal = 1;
793 painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
794 "A cutoff radius (rcut) must be specified when calculating Hydrogen "
795 "Bonding Statistics");
796 painCave.severity = OPENMD_ERROR;
797 painCave.isFatal = 1;
801 }
else if (args_info.hbondz_given) {
802 if (args_info.rcut_given) {
803 if (args_info.thetacut_given) {
804 analyser = std::make_unique<HBondZ>(
805 info, dumpFileName, sele1, sele2, args_info.rcut_arg,
806 args_info.thetacut_arg, args_info.nbins_arg);
808 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
809 "A cutoff angle (thetacut) must be specified when calculating "
811 "Bonding Statistics");
812 painCave.severity = OPENMD_ERROR;
813 painCave.isFatal = 1;
818 painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
819 "A cutoff radius (rcut) must be specified when calculating Hydrogen "
820 "Bonding Statistics");
821 painCave.severity = OPENMD_ERROR;
822 painCave.isFatal = 1;
825 }
else if (args_info.hbondzvol_given) {
826 if (args_info.rcut_given) {
827 if (args_info.thetacut_given) {
828 analyser = std::make_unique<HBondZvol>(
829 info, dumpFileName, sele1, sele2, args_info.rcut_arg,
830 args_info.thetacut_arg, args_info.nbins_arg);
832 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
833 "A cutoff angle (thetacut) must be specified when calculating "
835 "Bonding Statistics");
836 painCave.severity = OPENMD_ERROR;
837 painCave.isFatal = 1;
842 painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
843 "A cutoff radius (rcut) must be specified when calculating Hydrogen "
844 "Bonding Statistics");
845 painCave.severity = OPENMD_ERROR;
846 painCave.isFatal = 1;
849 }
else if (args_info.hbondr_given) {
850 if (args_info.rcut_given) {
851 if (args_info.thetacut_given) {
852 analyser = std::make_unique<HBondR>(
853 info, dumpFileName, sele1, sele2, sele3, args_info.rcut_arg, maxLen,
854 args_info.thetacut_arg, args_info.nrbins_arg);
856 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
857 "A cutoff angle (thetacut) must be specified when calculating "
859 "Bonding Statistics");
860 painCave.severity = OPENMD_ERROR;
861 painCave.isFatal = 1;
866 painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
867 "A cutoff radius (rcut) must be specified when calculating Hydrogen "
868 "Bonding Statistics");
869 painCave.severity = OPENMD_ERROR;
870 painCave.isFatal = 1;
873 }
else if (args_info.hbondrvol_given) {
874 if (args_info.rcut_given) {
875 if (args_info.thetacut_given) {
876 analyser = std::make_unique<HBondRvol>(
877 info, dumpFileName, sele1, sele2, sele3, args_info.rcut_arg, maxLen,
878 args_info.thetacut_arg, args_info.nrbins_arg);
880 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
881 "A cutoff angle (thetacut) must be specified when calculating "
883 "Bonding Statistics");
884 painCave.severity = OPENMD_ERROR;
885 painCave.isFatal = 1;
890 painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
891 "A cutoff radius (rcut) must be specified when calculating Hydrogen "
892 "Bonding Statistics");
893 painCave.severity = OPENMD_ERROR;
894 painCave.isFatal = 1;
897 }
else if (args_info.potDiff_given) {
898 analyser = std::make_unique<PotDiff>(info, dumpFileName, sele1);
899 }
else if (args_info.kirkwood_given) {
900 analyser = std::make_unique<Kirkwood>(info, dumpFileName, sele1, sele2,
902 }
else if (args_info.kirkwoodQ_given) {
903 analyser = std::make_unique<KirkwoodQuadrupoles>(info, dumpFileName, sele1,
904 sele2, maxLen, nrbins);
905 }
else if (args_info.densityfield_given) {
906 analyser = std::make_unique<DensityField>(info, dumpFileName, sele1,
907 args_info.voxelSize_arg);
908 }
else if (args_info.velocityfield_given) {
909 analyser = std::make_unique<VelocityField>(info, dumpFileName, sele1,
910 args_info.voxelSize_arg);
911 }
else if (args_info.velocityZ_given) {
912 switch (privilegedAxis) {
914 if (privilegedAxis2 == 1) {
915 analyser = std::make_unique<VelocityZ>(
916 info, dumpFileName, sele1, args_info.nbins_x_arg,
917 args_info.nbins_y_arg, privilegedAxis, privilegedAxis2);
918 }
else if (privilegedAxis2 == 2) {
919 analyser = std::make_unique<VelocityZ>(
920 info, dumpFileName, sele1, args_info.nbins_x_arg,
921 args_info.nbins_z_arg, privilegedAxis, privilegedAxis2);
925 if (privilegedAxis2 == 0) {
926 analyser = std::make_unique<VelocityZ>(
927 info, dumpFileName, sele1, args_info.nbins_y_arg,
928 args_info.nbins_x_arg, privilegedAxis, privilegedAxis2);
929 }
else if (privilegedAxis2 == 2) {
930 analyser = std::make_unique<VelocityZ>(
931 info, dumpFileName, sele1, args_info.nbins_y_arg,
932 args_info.nbins_z_arg, privilegedAxis, privilegedAxis2);
937 if (privilegedAxis2 == 0) {
938 analyser = std::make_unique<VelocityZ>(
939 info, dumpFileName, sele1, args_info.nbins_z_arg,
940 args_info.nbins_x_arg, privilegedAxis, privilegedAxis2);
941 }
else if (privilegedAxis2 == 1) {
942 analyser = std::make_unique<VelocityZ>(
943 info, dumpFileName, sele1, args_info.nbins_z_arg,
944 args_info.nbins_y_arg, privilegedAxis, privilegedAxis2);
948 }
else if (args_info.dipole_orientation_given) {
949 if (args_info.dipoleX_given && args_info.dipoleY_given &&
950 args_info.dipoleZ_given)
951 analyser = std::make_unique<DipoleOrientation>(
952 info, dumpFileName, sele1, args_info.dipoleX_arg,
953 args_info.dipoleY_arg, args_info.dipoleZ_arg, args_info.nbins_arg,
956 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
957 "Dipole components must be provided.");
958 painCave.severity = OPENMD_ERROR;
959 painCave.isFatal = 1;
963 }
else if (args_info.order_prob_given) {
964 if (args_info.dipoleX_given && args_info.dipoleY_given &&
965 args_info.dipoleZ_given)
966 analyser = std::make_unique<OrderParameterProbZ>(
967 info, dumpFileName, sele1, args_info.dipoleX_arg,
968 args_info.dipoleY_arg, args_info.dipoleZ_arg, args_info.nbins_arg,
971 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
972 "Dipole components must be provided.");
973 painCave.severity = OPENMD_ERROR;
974 painCave.isFatal = 1;
979 if (analyser != NULL) {
980 if (args_info.output_given) {
981 analyser->setOutputName(args_info.output_arg);
983 if (args_info.step_given) { analyser->setStep(args_info.step_arg); }
987 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
988 "StaticProps: No Analyser was created, nothing to do!");
989 painCave.severity = OPENMD_ERROR;
990 painCave.isFatal = 1;
StaticAnalyser for Potential Energy changes with charges turned off.
The header file for the command line option parser generated by GNU Gengetopt version 2....
The only responsibility of SimCreator is to parse the meta-data file and create a SimInfo instance ba...
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
SnapshotManager * getSnapshotManager()
Returns the snapshot manager.
Mat3x3d getHmat()
Returns the H-Matrix.
Snapshot * getCurrentSnapshot()
Returns the pointer of current snapshot.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
Where the command line options are stored.