00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef BALL_SOLVATION_POISSONBOLTZMANN_H
00010 #define BALL_SOLVATION_POISSONBOLTZMANN_H
00011
00012 #ifndef BALL_COMMON_H_
00013 # include <BALL/common.h>
00014 #endif
00015
00016 #ifndef BALL_DATATYPE_REGULARDATA3D_H
00017 # include <BALL/DATATYPE/regularData3D.h>
00018 #endif
00019
00020 #ifndef BALL_KERNEL_SYSTEM_H
00021 # include <BALL/KERNEL/system.h>
00022 #endif
00023
00024 #ifndef BALL_DATATYPE_OPTIONS_H
00025 # include <BALL/DATATYPE/options.h>
00026 #endif
00027
00028 #include <vector>
00029 using std::vector;
00030
00031 namespace BALL
00032 {
00036 class BALL_EXPORT FDPB
00037 {
00038
00039 public:
00040
00045 enum ErrorCode
00046 {
00049 ERROR__NONE = -1,
00050
00053 ERROR__UNKNOWN = 0,
00054
00058 ERROR__NOT_IMPLEMENTED = 1,
00059
00066 ERROR__CANNOT_CREATE_ATOM_ARRAY,
00067
00074 ERROR__CANNOT_CREATE_SAS_GRID,
00075
00084 ERROR__CANNOT_CREATE_EPSILON_GRID,
00085
00093 ERROR__CANNOT_CREATE_KAPPA_GRID,
00094
00101 ERROR__CANNOT_CREATE_CHARGE_GRID,
00102
00109 ERROR__CANNOT_CREATE_PHI_GRID,
00110
00117 ERROR__SAS_GRID_REQUIRED,
00118
00126 ERROR__EPSILON_GRID_REQUIRED,
00127
00134 ERROR__ATOM_ARRAY_REQUIRED,
00135
00143 ERROR__PHI_GRID_REQUIRED,
00144
00150 ERROR__OUT_OF_MEMORY,
00151
00160 ERROR__UNKNOWN_DIELECTRIC_SMOOTHING_METHOD,
00161
00169 ERROR__UNKNOWN_CHARGE_DISTRIBUTION_METHOD,
00170
00178 ERROR__UNKNOWN_BOUNDARY_CONDITION_TYPE,
00179
00187 ERROR__NOT_A_VECTOR_IN_UPPER_LOWER,
00188
00197 ERROR__ILLEGAL_VALUE_FOR_LOWER_UPPER,
00198
00204 ERROR__SETUP_REQUIRED,
00205
00208 NUMBER_OF_ERRORS
00209 };
00210
00216 struct BALL_EXPORT Option
00217 {
00225 static const String VERBOSITY;
00226
00236 static const String PRINT_TIMING;
00237
00245 static const String SPACING;
00246
00255 static const String BORDER;
00256
00265 static const String IONIC_STRENGTH;
00266
00272 static const String SOLUTE_DC;
00273
00279 static const String SOLVENT_DC;
00280
00286 static const String PROBE_RADIUS;
00287
00292 static const String ION_RADIUS;
00293
00299 static const String TEMPERATURE;
00300
00308 static const String BOUNDARY;
00309
00317 static const String CHARGE_DISTRIBUTION;
00318
00329 static const String DIELECTRIC_SMOOTHING;
00330
00338 static const String OFFSET;
00339
00348 static const String RMS_CRITERION;
00349
00357 static const String MAX_CRITERION;
00358
00365 static const String CHECK_AFTER_ITERATIONS;
00366
00375 static const String MAX_ITERATIONS;
00376
00385 static const String LOWER;
00386
00391 static const String UPPER;
00392
00398 static const String BOUNDING_BOX_LOWER;
00399
00404 static const String BOUNDING_BOX_UPPER;
00405
00406 };
00407
00411 struct BALL_EXPORT Boundary
00412 {
00419 static const String ZERO;
00420
00431 static const String DEBYE;
00432
00436 static const String COULOMB;
00437
00440 static const String DIPOLE;
00441
00448 static const String FOCUSING;
00449 };
00450
00453 struct BALL_EXPORT ChargeDistribution
00454 {
00458 static const String TRILINEAR;
00459
00463 static const String UNIFORM;
00464 };
00465
00472 struct BALL_EXPORT DielectricSmoothing
00473 {
00476 static const String NONE;
00477
00485 static const String UNIFORM;
00486
00494 static const String HARMONIC;
00495 };
00496
00501 struct BALL_EXPORT Default
00502 {
00507 static const int VERBOSITY;
00508
00513 static const bool PRINT_TIMING ;
00514
00519 static const float SPACING;
00520
00525 static const float BORDER;
00526
00531 static const float IONIC_STRENGTH;
00532
00537 static const float TEMPERATURE;
00538
00545 static const float PROBE_RADIUS;
00546
00551 static const float ION_RADIUS;
00552
00558 static const String BOUNDARY;
00559
00565 static const String CHARGE_DISTRIBUTION;
00566
00572 static const String DIELECTRIC_SMOOTHING;
00573
00578 static const float SOLVENT_DC;
00579
00584 static const float SOLUTE_DC;
00585
00592 static const float RMS_CRITERION;
00593
00600 static const float MAX_CRITERION;
00601
00607 static const Index MAX_ITERATIONS;
00608
00613 static const Index CHECK_AFTER_ITERATIONS;
00614 };
00615
00627 struct BALL_EXPORT FastAtomStruct
00628 {
00629 float q;
00630 float r;
00631 float x, y, z;
00632 Index index;
00633 };
00634
00635 typedef struct FastAtomStruct FastAtom;
00636
00637
00641
00645 FDPB();
00646
00650 FDPB(const FDPB& fdpb);
00651
00658 FDPB(System& system);
00659
00666 FDPB(Options& new_options);
00667
00675 FDPB(System& system, Options& new_options);
00676
00679 virtual ~FDPB();
00680
00683 void destroy();
00684
00693 void destroyGrids();
00694
00696
00701
00721 bool setup(System& system);
00722
00731 bool setup(System& system, Options& options);
00732
00757 bool setupEpsGrid(System& system);
00758
00759
00760
00764 bool setupSASGrid(System& system);
00765
00776 bool setupAtomArray(System& system);
00777
00780 bool setupKappaGrid();
00781
00784 bool setupQGrid();
00785
00788 bool setupPhiGrid();
00789
00792 bool setupBoundary();
00793
00795
00798
00801 bool solve();
00802
00810 double getEnergy() const;
00811
00815 double getReactionFieldEnergy() const;
00816
00820 double calculateReactionFieldEnergy() const;
00821
00830 Size getNumberOfIterations() const;
00831
00833
00837
00845 Index getErrorCode() const;
00846
00851 static String getErrorMessage(Index error_code);
00853
00854
00858
00861 Options options;
00862
00865 Options results;
00866
00868
00871
00876 TRegularData3D<Vector3>* eps_grid;
00877
00881 TRegularData3D<float>* kappa_grid;
00882
00891 TRegularData3D<float>* q_grid;
00892
00902 TRegularData3D<float>* phi_grid;
00903
00906 TRegularData3D<char>* SAS_grid;
00907
00911 vector<FDPB::FastAtom>* atom_array;
00912
00914
00915 protected:
00916
00917 Vector3 lower_;
00918 Vector3 upper_;
00919 Vector3 offset_;
00920
00921 bool use_offset_;
00922
00923 float spacing_;
00924
00925
00926 double energy_;
00927
00928
00929 double reaction_field_energy_;
00930
00931
00932
00933
00934 vector<Position> boundary_points_;
00935
00936
00937 Size number_of_iterations_;
00938
00939
00940
00941 int error_code_;
00942
00943 static const char* error_message_[];
00944 };
00945
00946 }
00947
00948 #endif