Skip to content

Commit e74e496

Browse files
committed
Let host manage lifetime of host input struct
1 parent 4cfdaf0 commit e74e496

File tree

10 files changed

+176
-253
lines changed

10 files changed

+176
-253
lines changed

api/pcmsolver.F90

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module pcmsolver
2-
3-
use, intrinsic :: iso_c_binding, only: c_bool, c_char, c_double, c_int
2+
3+
use, intrinsic :: iso_c_binding
44

55
implicit none
66

@@ -24,32 +24,26 @@ module pcmsolver
2424
public pcmsolver_load_surface_function
2525
public pcmsolver_write_timings
2626

27-
type, public, bind(C) :: cavityInput
27+
type, public, bind(C) :: PCMInput
28+
character(kind=c_char, len=1) :: cavity_type(8)
2829
integer(c_int) :: patch_level
2930
real(c_double) :: coarsity
3031
real(c_double) :: area
3132
real(c_double) :: min_distance
3233
integer(c_int) :: der_order
33-
character(kind=c_char, len=1) :: cavity_type(8)
3434
logical(c_bool) :: scaling
35+
character(kind=c_char, len=1) :: radii_set(8)
3536
character(kind=c_char, len=1) :: restart_name(20)
3637
real(c_double) :: min_radius
37-
character(kind=c_char, len=1) :: radii_set(8)
38-
end type
39-
40-
type, public, bind(C) :: solverInput
4138
character(kind=c_char, len=1) :: solver_type(7)
42-
real(c_double) :: correction
4339
character(kind=c_char, len=1) :: solvent(16)
44-
real(c_double) :: probe_radius
4540
character(kind=c_char, len=1) :: equation_type(11)
46-
end type
47-
48-
type, public, bind(C) :: greenInput
41+
real(c_double) :: correction
42+
real(c_double) :: probe_radius
4943
character(kind=c_char, len=1) :: inside_type(7)
5044
real(c_double) :: outside_epsilon
5145
character(kind=c_char, len=1) :: outside_type(22)
52-
end type
46+
end type PCMInput
5347

5448
public PCMSOLVER_READER_OWN
5549
public PCMSOLVER_READER_HOST
@@ -59,65 +53,66 @@ module pcmsolver
5953
end enum
6054

6155
interface pcmsolver_new
62-
function pcmsolver_new(input_reading, nr_nuclei, charges, coordinates, symmetry_info) result(context) bind(C)
63-
use, intrinsic :: iso_c_binding, only: c_int, c_double, c_ptr
56+
function pcmsolver_new(input_reading, nr_nuclei, charges, coordinates, symmetry_info, host_input) result(context) bind(C)
57+
import
6458
integer(c_int), value :: input_reading
6559
integer(c_int), value :: nr_nuclei
66-
real(c_double), intent(out) :: charges(*)
67-
real(c_double), intent(out) :: coordinates(*)
68-
integer(c_int), intent(out) :: symmetry_info(*)
60+
real(c_double), intent(in) :: charges(*)
61+
real(c_double), intent(in) :: coordinates(*)
62+
integer(c_int), intent(in) :: symmetry_info(*)
63+
type(PCMInput), intent(in) :: host_input
6964
type(c_ptr) :: context
7065
end function pcmsolver_new
7166
end interface pcmsolver_new
7267

7368
interface pcmsolver_delete
7469
subroutine pcmsolver_delete(context) bind(C)
75-
use, intrinsic :: iso_c_binding, only: c_ptr
70+
import
7671
type(c_ptr), value :: context
7772
end subroutine pcmsolver_delete
7873
end interface pcmsolver_delete
7974

8075
interface pcmsolver_is_compatible_library
8176
function pcmsolver_is_compatible_library() result(compatible) bind(C)
82-
use, intrinsic :: iso_c_binding, only: c_bool
77+
import
8378
logical(c_bool) :: compatible
8479
end function pcmsolver_is_compatible_library
8580
end interface pcmsolver_is_compatible_library
8681

8782
interface pcmsolver_print
8883
subroutine pcmsolver_print(context) bind(C)
89-
use, intrinsic :: iso_c_binding, only: c_ptr
84+
import
9085
type(c_ptr), value :: context
9186
end subroutine pcmsolver_print
9287
end interface pcmsolver_print
9388

9489
interface pcmsolver_get_cavity_size
9590
function pcmsolver_get_cavity_size(context) result(nr_points) bind(C)
96-
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t
91+
import
9792
type(c_ptr), value :: context
9893
integer(c_size_t) :: nr_points
9994
end function pcmsolver_get_cavity_size
10095
end interface pcmsolver_get_cavity_size
10196

10297
interface pcmsolver_get_irreducible_cavity_size
10398
function pcmsolver_get_irreducible_cavity_size(context) result(nr_points_irr) bind(C)
104-
use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t
99+
import
105100
type(c_ptr), value :: context
106101
integer(c_size_t) :: nr_points_irr
107102
end function pcmsolver_get_irreducible_cavity_size
108103
end interface pcmsolver_get_irreducible_cavity_size
109104

110105
interface pcmsolver_get_centers
111106
subroutine pcmsolver_get_centers(context, centers) bind(C)
112-
use, intrinsic :: iso_c_binding, only: c_ptr, c_double
107+
import
113108
type(c_ptr), value :: context
114109
real(c_double), intent(inout) :: centers(*)
115110
end subroutine pcmsolver_get_centers
116111
end interface pcmsolver_get_centers
117112

118113
interface pcmsolver_get_center
119114
subroutine pcmsolver_get_center(context, its, center) bind(C)
120-
use, intrinsic :: iso_c_binding, only: c_ptr, c_int, c_double
115+
import
121116
type(c_ptr), value :: context
122117
integer(c_int), value, intent(in) :: its
123118
real(c_double), intent(inout) :: center(*)
@@ -126,7 +121,7 @@ end subroutine pcmsolver_get_center
126121

127122
interface pcmsolver_compute_asc
128123
subroutine pcmsolver_compute_asc(context, mep_name, asc_name, irrep) bind(C)
129-
use, intrinsic :: iso_c_binding, only: c_ptr, c_char, c_int
124+
import
130125
type(c_ptr), value :: context
131126
character(c_char), intent(in) :: mep_name, asc_name
132127
integer(c_int), value, intent(in) :: irrep
@@ -135,7 +130,7 @@ end subroutine pcmsolver_compute_asc
135130

136131
interface pcmsolver_compute_response_asc
137132
subroutine pcmsolver_compute_response_asc(context, mep_name, asc_name, irrep) bind(C)
138-
use, intrinsic :: iso_c_binding, only: c_ptr, c_char, c_int
133+
import
139134
type(c_ptr), value :: context
140135
character(c_char), intent(in) :: mep_name, asc_name
141136
integer(c_int), value, intent(in) :: irrep
@@ -144,16 +139,16 @@ end subroutine pcmsolver_compute_response_asc
144139

145140
interface pcmsolver_compute_polarization_energy
146141
function pcmsolver_compute_polarization_energy(context, mep_name, asc_name) result(energy) bind(C)
147-
use, intrinsic :: iso_c_binding, only: c_ptr, c_char, c_double
142+
import
148143
type(c_ptr), value :: context
149144
character(c_char), intent(in) :: mep_name, asc_name
150145
real(c_double) :: energy
151146
end function pcmsolver_compute_polarization_energy
152147
end interface pcmsolver_compute_polarization_energy
153-
148+
154149
interface pcmsolver_get_surface_function
155150
subroutine pcmsolver_get_surface_function(context, f_size, values, name) bind(C)
156-
use, intrinsic :: iso_c_binding, only: c_ptr, c_char, c_size_t, c_double
151+
import
157152
type(c_ptr), value :: context
158153
integer(c_size_t), value, intent(in) :: f_size
159154
real(c_double), intent(inout) :: values(*)
@@ -163,7 +158,7 @@ end subroutine pcmsolver_get_surface_function
163158

164159
interface pcmsolver_set_surface_function
165160
subroutine pcmsolver_set_surface_function(context, f_size, values, name) bind(C)
166-
use, intrinsic :: iso_c_binding, only: c_ptr, c_char, c_size_t, c_double
161+
import
167162
type(c_ptr), value :: context
168163
integer(c_size_t), value, intent(in) :: f_size
169164
real(c_double), intent(in) :: values(*)
@@ -173,30 +168,30 @@ end subroutine pcmsolver_set_surface_function
173168

174169
interface pcmsolver_save_surface_functions
175170
subroutine pcmsolver_save_surface_functions(context) bind(C)
176-
use, intrinsic :: iso_c_binding, only: c_ptr
171+
import
177172
type(c_ptr), value :: context
178173
end subroutine pcmsolver_save_surface_functions
179174
end interface pcmsolver_save_surface_functions
180175

181176
interface pcmsolver_save_surface_function
182177
subroutine pcmsolver_save_surface_function(context, name) bind(C)
183-
use, intrinsic :: iso_c_binding, only: c_ptr, c_char
178+
import
184179
type(c_ptr), value :: context
185180
character(c_char), intent(in) :: name
186181
end subroutine pcmsolver_save_surface_function
187182
end interface pcmsolver_save_surface_function
188183

189184
interface pcmsolver_load_surface_function
190185
subroutine pcmsolver_load_surface_function(context, name) bind(C)
191-
use, intrinsic :: iso_c_binding, only: c_ptr, c_char
186+
import
192187
type(c_ptr), value :: context
193188
character(c_char), intent(in) :: name
194189
end subroutine pcmsolver_load_surface_function
195190
end interface pcmsolver_load_surface_function
196191

197192
interface pcmsolver_write_timings
198193
subroutine pcmsolver_write_timings(context) bind(C)
199-
use, intrinsic :: iso_c_binding, only: c_ptr
194+
import
200195
type(c_ptr), value :: context
201196
end subroutine pcmsolver_write_timings
202197
end interface pcmsolver_write_timings

api/pcmsolver.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@
2525
extern "C" {
2626
#endif
2727

28-
struct cavityInput;
29-
struct solverInput;
30-
struct greenInput;
28+
struct PCMInput;
3129

3230
struct pcmsolver_context_s;
3331
typedef struct pcmsolver_context_s pcmsolver_context_t;
@@ -39,13 +37,13 @@ typedef enum
3937
} pcmsolver_reader_t;
4038

4139
void host_writer(const char *);
42-
void host_input(cavityInput *, solverInput *, greenInput *);
4340

4441
PCMSOLVER_API pcmsolver_context_t * pcmsolver_new(pcmsolver_reader_t input_reading,
4542
int nr_nuclei,
4643
double charges[],
4744
double coordinates[],
48-
int symmetry_info[]);
45+
int symmetry_info[],
46+
PCMInput * host_input);
4947

5048
PCMSOLVER_API void pcmsolver_delete(pcmsolver_context_t * context);
5149

cmake/autocmake.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[project]
22
name: PCMSolver
33
min_cmake_version: 2.8.3
4+
setup_script: setup.py
45

56
[cxx]
67
source: https://github.com/scisoft/autocmake/raw/master/modules/cxx.cmake

cmake/downloaded/autocmake_boost.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ set(BOOST_ARCHIVE boost_${BOOSTVER}.zip)
6363
set(Boost_USE_STATIC_LIBS ON)
6464
set(Boost_USE_MULTITHREADED ON)
6565
set(Boost_USE_STATIC_RUNTIME OFF)
66-
set(Boost_DEBUG ON)
67-
set(Boost_DETAILED_FAILURE_MESSAGE ON)
66+
set(Boost_DEBUG OFF)
67+
set(Boost_DETAILED_FAILURE_MESSAGE OFF)
6868

6969
set(BUILD_CUSTOM_BOOST FALSE)
7070
if(FORCE_CUSTOM_BOOST)
@@ -107,7 +107,7 @@ if(BUILD_CUSTOM_BOOST)
107107
include(${CMAKE_CURRENT_LIST_DIR}/boost_unpack.cmake)
108108
include(${CMAKE_CURRENT_LIST_DIR}/boost_userconfig.cmake)
109109

110-
if(NOT BOOST_COMPONENTS_REQUIRED STREQUAL "")
110+
if(NOT "${BOOST_COMPONENTS_REQUIRED}" STREQUAL "")
111111
# Non-empty list. Compiled libraries needed
112112
# Transform the ;-separated list to a ,-separated list (digested by the Boost build toolchain!)
113113
string(REPLACE ";" "," b2_needed_components "${BOOST_COMPONENTS_REQUIRED}")

cmake/update.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ def autogenerated_notice():
128128
# ------------------------------------------------------------------------------
129129

130130

131-
def gen_setup(config, relative_path):
131+
def gen_setup(config, relative_path, setup_script_name):
132132
"""
133-
Generate setup.py script.
133+
Generate setup script.
134134
"""
135135
s = []
136136
s.append('#!/usr/bin/env python')
@@ -145,8 +145,8 @@ def gen_setup(config, relative_path):
145145

146146
s.append('\n\noptions = """')
147147
s.append('Usage:')
148-
s.append(' ./setup.py [options] [<builddir>]')
149-
s.append(' ./setup.py (-h | --help)')
148+
s.append(' ./{0} [options] [<builddir>]'.format(setup_script_name))
149+
s.append(' ./{0} (-h | --help)'.format(setup_script_name))
150150
s.append('\nOptions:')
151151

152152
options = []
@@ -334,7 +334,7 @@ def main(argv):
334334
sys.stderr.write("Step 1: Update or create infrastructure files\n")
335335
sys.stderr.write(" which will be needed to configure and build the project:\n")
336336
sys.stderr.write(" $ %s --self\n\n" % argv[0])
337-
sys.stderr.write("Step 2: Create CMakeLists.txt and setup.py in PROJECT_ROOT:\n")
337+
sys.stderr.write("Step 2: Create CMakeLists.txt and setup script in PROJECT_ROOT:\n")
338338
sys.stderr.write(" $ %s <PROJECT_ROOT>\n" % argv[0])
339339
sys.stderr.write(" example:\n")
340340
sys.stderr.write(" $ %s ..\n" % argv[0])
@@ -343,7 +343,7 @@ def main(argv):
343343
if argv[1] in ['-h', '--help']:
344344
print('Usage:')
345345
print(' python update.py --self Update this script and fetch or update infrastructure files under lib/.')
346-
print(' python update.py <builddir> (Re)generate CMakeLists.txt and setup.py and fetch or update CMake modules.')
346+
print(' python update.py <builddir> (Re)generate CMakeLists.txt and setup script and fetch or update CMake modules.')
347347
print(' python update.py (-h | --help) Show this help text.')
348348
sys.exit(0)
349349

@@ -398,7 +398,12 @@ def main(argv):
398398
sys.exit(-1)
399399
min_cmake_version = config.get('project', 'min_cmake_version')
400400

401-
# get relative path from setup.py script to this directory
401+
if config.has_option('project', 'setup_script'):
402+
setup_script_name = config.get('project', 'setup_script')
403+
else:
404+
setup_script_name = 'setup'
405+
406+
# get relative path from setup script to this directory
402407
relative_path = os.path.relpath(os.path.abspath('.'), project_root)
403408

404409
# fetch modules from the web or from relative paths
@@ -410,10 +415,10 @@ def main(argv):
410415
with open(os.path.join(project_root, 'CMakeLists.txt'), 'w') as f:
411416
f.write('%s\n' % '\n'.join(s))
412417

413-
# create setup.py
414-
print('- generating setup.py')
415-
s = gen_setup(config, relative_path)
416-
file_path = os.path.join(project_root, 'setup.py')
418+
# create setup script
419+
print('- generating setup script')
420+
s = gen_setup(config, relative_path, setup_script_name)
421+
file_path = os.path.join(project_root, setup_script_name)
417422
with open(file_path, 'w') as f:
418423
f.write('%s\n' % '\n'.join(s))
419424
if sys.platform != 'win32':

src/interface/Meddle.cpp

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@
3838
#include "Cavity.hpp"
3939
#include "RegisterCavityToFactory.hpp"
4040
#include "IGreensFunction.hpp"
41-
#include "InputManager.hpp"
4241
#include "RegisterGreensFunctionToFactory.hpp"
4342
#include "PCMSolver.hpp"
4443
#include "RegisterSolverToFactory.hpp"
4544
#include "Atom.hpp"
4645
#include "Citation.hpp"
4746
#include "cnpy.hpp"
47+
#include "PCMInput.hpp"
4848
#include "PhysicalConstants.hpp"
4949
#include "Solvent.hpp"
5050
#include "Sphere.hpp"
@@ -58,9 +58,9 @@
5858
#endif
5959

6060
PCMSOLVER_API
61-
pcmsolver_context_t * pcmsolver_new(pcmsolver_reader_t input_reading, int nr_nuclei, double charges[], double coordinates[], int symmetry_info[])
61+
pcmsolver_context_t * pcmsolver_new(pcmsolver_reader_t input_reading, int nr_nuclei, double charges[], double coordinates[], int symmetry_info[], PCMInput * host_input)
6262
{
63-
return AS_TYPE(pcmsolver_context_t, new pcm::Meddle(input_reading, nr_nuclei, charges, coordinates, symmetry_info));
63+
return AS_TYPE(pcmsolver_context_t, new pcm::Meddle(input_reading, nr_nuclei, charges, coordinates, symmetry_info, *host_input));
6464
}
6565

6666
PCMSOLVER_API
@@ -172,10 +172,10 @@ void pcmsolver_write_timings(pcmsolver_context_t * context)
172172
}
173173

174174
namespace pcm {
175-
Meddle::Meddle(pcmsolver_reader_t input_reading, int nr_nuclei, double charges[], double coordinates[], int symmetry_info[])
175+
Meddle::Meddle(pcmsolver_reader_t input_reading, int nr_nuclei, double charges[], double coordinates[], int symmetry_info[], const PCMInput & host_input)
176176
: hasDynamic_(false)
177177
{
178-
initInput(input_reading, nr_nuclei, charges, coordinates, symmetry_info);
178+
initInput(input_reading, nr_nuclei, charges, coordinates, symmetry_info, host_input);
179179
initCavity();
180180
initStaticSolver();
181181
if (input_.isDynamic()) initDynamicSolver();
@@ -351,22 +351,11 @@ namespace pcm {
351351
TIMER_DONE("pcmsolver.timer.dat");
352352
}
353353

354-
void Meddle::initInput(pcmsolver_reader_t input_reading, int nr_nuclei, double charges[], double coordinates[], int symmetry_info[])
354+
void Meddle::initInput(pcmsolver_reader_t input_reading, int nr_nuclei, double charges[], double coordinates[], int symmetry_info[], const PCMInput & host_input)
355355
{
356356
if (input_reading) {
357-
cavityInput cav;
358-
init(cav);
359-
solverInput solv;
360-
init(solv);
361-
greenInput green;
362-
init(green);
363-
364-
host_input(&cav, &solv, &green);
365-
366-
trim(cav);
367-
trim(solv);
368-
trim(green);
369-
input_ = Input(cav, solv, green);
357+
//trim(host_input);
358+
input_ = Input(host_input);
370359
} else {
371360
input_ = Input("@pcmsolver.inp");
372361
}

0 commit comments

Comments
 (0)