| @@ -0,0 +1,51 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/common_sponge.cuh" | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/common/crd_to_uint_crd_impl.cuh" | |||||
| __global__ void Crd_To_Uint_Crd(const int atom_numbers, const VECTOR *scale_factor, const VECTOR *crd, | |||||
| UNSIGNED_INT_VECTOR *uint_crd) { | |||||
| int atom_i = blockDim.x * blockIdx.x + threadIdx.x; | |||||
| if (atom_i < atom_numbers) { | |||||
| uint_crd[atom_i].uint_x = crd[atom_i].x * scale_factor[0].x; | |||||
| uint_crd[atom_i].uint_y = crd[atom_i].y * scale_factor[0].y; | |||||
| uint_crd[atom_i].uint_z = crd[atom_i].z * scale_factor[0].z; | |||||
| /*uint_crd[atom_i].uint_x = 2 * uint_crd[atom_i].uint_x; | |||||
| uint_crd[atom_i].uint_y = 2 * uint_crd[atom_i].uint_y; | |||||
| uint_crd[atom_i].uint_z = 2 * uint_crd[atom_i].uint_z;*/ | |||||
| uint_crd[atom_i].uint_x = uint_crd[atom_i].uint_x << 1; | |||||
| uint_crd[atom_i].uint_y = uint_crd[atom_i].uint_y << 1; | |||||
| uint_crd[atom_i].uint_z = uint_crd[atom_i].uint_z << 1; | |||||
| } | |||||
| } | |||||
| void CrdToUintCrd(const int atom_numbers, const float *crd_to_uint_crd_cof_f, const float *crd_f, | |||||
| unsigned int *uint_crd_f, cudaStream_t stream) { | |||||
| VECTOR *crd = const_cast<VECTOR *>(reinterpret_cast<const VECTOR *>(crd_f)); | |||||
| VECTOR *crd_to_uint_crd_cof = const_cast<VECTOR *>(reinterpret_cast<const VECTOR *>(crd_to_uint_crd_cof_f)); | |||||
| UNSIGNED_INT_VECTOR *uint_crd = | |||||
| const_cast<UNSIGNED_INT_VECTOR *>(reinterpret_cast<const UNSIGNED_INT_VECTOR *>(uint_crd_f)); | |||||
| Crd_To_Uint_Crd<<<ceilf(static_cast<float>(atom_numbers) / 128.0), 128, 0, stream>>>( | |||||
| atom_numbers, crd_to_uint_crd_cof, crd, uint_crd); | |||||
| return; | |||||
| } | |||||
| void CrdToUintCrd(const int atom_numbers, const float *crd_to_uint_crd_cof_f, const float *crd_f, | |||||
| unsigned int *uint_crd_f, cudaStream_t stream); | |||||
| @@ -0,0 +1,26 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #ifndef MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_CRD_TO_UINT_CRD_IMPL_H_ | |||||
| #define MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_CRD_TO_UINT_CRD_IMPL_H_ | |||||
| #include <curand_kernel.h> | |||||
| #include "runtime/device/gpu/cuda_common.h" | |||||
| void CrdToUintCrd(const int atom_numbers, const float *crd_to_uint_crd_cof_f, const float *crd_f, | |||||
| unsigned int *uint_crd_f, cudaStream_t stream); | |||||
| #endif // MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_CRD_TO_UINT_CRD_IMPL_H_ | |||||
| @@ -14,7 +14,7 @@ | |||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/neighbor_list/neighbor_list_impl.cuh" | #include "backend/kernel_compiler/gpu/cuda_impl/sponge/neighbor_list/neighbor_list_impl.cuh" | ||||
| #include <vector> | |||||
| __global__ void Copy_List(const int element_numbers, const int *origin_list, int *list) { | __global__ void Copy_List(const int element_numbers, const int *origin_list, int *list) { | ||||
| int i = blockDim.x * blockIdx.x + threadIdx.x; | int i = blockDim.x * blockIdx.x + threadIdx.x; | ||||
| if (i < element_numbers) { | if (i < element_numbers) { | ||||
| @@ -387,7 +387,7 @@ __global__ void Mul_half(float *src, float *dst) { | |||||
| } | } | ||||
| } | } | ||||
| void Neighbor_List_Update(int grid_numbers, int atom_numbers, int refresh_count, int refresh_interval, | |||||
| void Neighbor_List_Update(int grid_numbers, int atom_numbers, int *d_refresh_count, int refresh_interval, | |||||
| int not_first_time, float skin, int Nxy, float cutoff_square, float cutoff_with_skin_square, | int not_first_time, float skin, int Nxy, float cutoff_square, float cutoff_with_skin_square, | ||||
| int *grid_N, float *box_length, int *atom_numbers_in_grid_bucket, float *grid_length_inverse, | int *grid_N, float *box_length, int *atom_numbers_in_grid_bucket, float *grid_length_inverse, | ||||
| int *atom_in_grid_serial, GRID_BUCKET *bucket, float *crd, float *old_crd, | int *atom_in_grid_serial, GRID_BUCKET *bucket, float *crd, float *old_crd, | ||||
| @@ -397,15 +397,22 @@ void Neighbor_List_Update(int grid_numbers, int atom_numbers, int refresh_count, | |||||
| int *is_need_refresh_neighbor_list, cudaStream_t stream) { | int *is_need_refresh_neighbor_list, cudaStream_t stream) { | ||||
| if (not_first_time) { | if (not_first_time) { | ||||
| if (refresh_interval > 0) { | if (refresh_interval > 0) { | ||||
| std::vector<int> refresh_count_list(1); | |||||
| cudaMemcpyAsync(refresh_count_list.data(), d_refresh_count, sizeof(int), cudaMemcpyDeviceToHost, stream); | |||||
| cudaStreamSynchronize(stream); | |||||
| int refresh_count = refresh_count_list[0]; | |||||
| if (refresh_count % refresh_interval == 0) { | if (refresh_count % refresh_interval == 0) { | ||||
| Mul_half<<<1, 3, 0, stream>>>(crd_to_uint_crd_cof, half_crd_to_uint_crd_cof); | Mul_half<<<1, 3, 0, stream>>>(crd_to_uint_crd_cof, half_crd_to_uint_crd_cof); | ||||
| Refresh_Neighbor_List_No_Check( | |||||
| grid_numbers, atom_numbers, skin, Nxy, cutoff_square, grid_N, box_length, atom_numbers_in_grid_bucket, | |||||
| grid_length_inverse, atom_in_grid_serial, bucket, reinterpret_cast<VECTOR *>(crd), | |||||
| reinterpret_cast<VECTOR *>(old_crd), crd_to_uint_crd_cof, reinterpret_cast<UNSIGNED_INT_VECTOR *>(uint_crd), | |||||
| uint_dr_to_dr_cof, gpointer, d_nl, excluded_list_start, excluded_list, excluded_numbers, stream); | |||||
| Refresh_Neighbor_List_No_Check(grid_numbers, atom_numbers, skin, Nxy, cutoff_square, grid_N, box_length, | |||||
| atom_numbers_in_grid_bucket, grid_length_inverse, atom_in_grid_serial, bucket, | |||||
| reinterpret_cast<VECTOR *>(crd), reinterpret_cast<VECTOR *>(old_crd), | |||||
| half_crd_to_uint_crd_cof, reinterpret_cast<UNSIGNED_INT_VECTOR *>(uint_crd), | |||||
| uint_dr_to_dr_cof, gpointer, d_nl, excluded_list_start, excluded_list, | |||||
| excluded_numbers, stream); | |||||
| } | } | ||||
| refresh_count += 1; | refresh_count += 1; | ||||
| cudaMemcpyAsync(d_refresh_count, &refresh_count, sizeof(int), cudaMemcpyHostToDevice, stream); | |||||
| } else { | } else { | ||||
| Is_need_refresh_neighbor_list_cuda<<<ceilf(static_cast<float>(atom_numbers) / 128), 128, 0, stream>>>( | Is_need_refresh_neighbor_list_cuda<<<ceilf(static_cast<float>(atom_numbers) / 128), 128, 0, stream>>>( | ||||
| atom_numbers, reinterpret_cast<VECTOR *>(crd), reinterpret_cast<VECTOR *>(old_crd), half_skin_square, | atom_numbers, reinterpret_cast<VECTOR *>(crd), reinterpret_cast<VECTOR *>(old_crd), half_skin_square, | ||||
| @@ -48,7 +48,7 @@ void Construct_Neighbor_List(int grid_numbers, int max_neighbor_numbers, int *nl | |||||
| void CopyNeighborListAtomNumber(int atom_numbers, NEIGHBOR_LIST *nl, int *nl_atom_numbers, cudaStream_t stream); | void CopyNeighborListAtomNumber(int atom_numbers, NEIGHBOR_LIST *nl, int *nl_atom_numbers, cudaStream_t stream); | ||||
| void Neighbor_List_Update(int grid_numbers, int atom_numbers, int refresh_count, int refresh_interval, | |||||
| void Neighbor_List_Update(int grid_numbers, int atom_numbers, int* d_refresh_count, int refresh_interval, | |||||
| int not_first_time, float skin, int Nxy, float cutoff_square, float cutoff_with_skin_square, | int not_first_time, float skin, int Nxy, float cutoff_square, float cutoff_with_skin_square, | ||||
| int *grid_N, float *box_length, int *atom_numbers_in_grid_bucket, float *grid_length_inverse, | int *grid_N, float *box_length, int *atom_numbers_in_grid_bucket, float *grid_length_inverse, | ||||
| int *atom_in_grid_serial, GRID_BUCKET *bucket, float *crd, float *old_crd, | int *atom_in_grid_serial, GRID_BUCKET *bucket, float *crd, float *old_crd, | ||||
| @@ -0,0 +1,67 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/nvtit/md_iteration_leap_frog_liujian_gpu_impl.cuh" | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/util.cuh" | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/common_sponge.cuh" | |||||
| __global__ void MD_Iteration_Leap_Frog_With_LiuJian_kernel(const int atom_numbers, const float half_dt, const float dt, | |||||
| const float exp_gamma, float *inverse_mass, | |||||
| float *sqrt_mass_inverse, VECTOR *vel, VECTOR *crd, | |||||
| VECTOR *frc, VECTOR *acc, VECTOR *random_frc, | |||||
| VECTOR *output) { | |||||
| int i = blockDim.x * blockIdx.x + threadIdx.x; | |||||
| if (i < atom_numbers) { | |||||
| acc[i].x = inverse_mass[i] * frc[i].x; | |||||
| acc[i].y = inverse_mass[i] * frc[i].y; | |||||
| acc[i].z = inverse_mass[i] * frc[i].z; | |||||
| vel[i].x = vel[i].x + dt * acc[i].x; | |||||
| vel[i].y = vel[i].y + dt * acc[i].y; | |||||
| vel[i].z = vel[i].z + dt * acc[i].z; | |||||
| output[i].x = crd[i].x + half_dt * vel[i].x; | |||||
| output[i].y = crd[i].y + half_dt * vel[i].y; | |||||
| output[i].z = crd[i].z + half_dt * vel[i].z; | |||||
| vel[i].x = exp_gamma * vel[i].x + sqrt_mass_inverse[i] * random_frc[i].x; | |||||
| vel[i].y = exp_gamma * vel[i].y + sqrt_mass_inverse[i] * random_frc[i].y; | |||||
| vel[i].z = exp_gamma * vel[i].z + sqrt_mass_inverse[i] * random_frc[i].z; | |||||
| output[i].x = output[i].x + half_dt * vel[i].x; | |||||
| output[i].y = output[i].y + half_dt * vel[i].y; | |||||
| output[i].z = output[i].z + half_dt * vel[i].z; | |||||
| } | |||||
| } | |||||
| void MD_Iteration_Leap_Frog_With_LiuJian(const int atom_numbers, const float half_dt, const float dt, | |||||
| const float exp_gamma, int float4_numbers, float *inverse_mass, | |||||
| float *sqrt_mass_inverse, float *vel, float *crd, float *frc, float *acc, | |||||
| curandStatePhilox4_32_10_t *rand_state, float *rand_frc, float *output, | |||||
| cudaStream_t stream) { | |||||
| Rand_Normal<<<ceilf(static_cast<float>(float4_numbers) / 32.), 32, 0, stream>>>(float4_numbers, rand_state, | |||||
| reinterpret_cast<float4 *>(rand_frc)); | |||||
| VECTOR *d_vel = reinterpret_cast<VECTOR *>(vel); | |||||
| VECTOR *d_crd = reinterpret_cast<VECTOR *>(crd); | |||||
| VECTOR *d_frc = reinterpret_cast<VECTOR *>(frc); | |||||
| VECTOR *d_acc = reinterpret_cast<VECTOR *>(acc); | |||||
| VECTOR *d_rand_frc = reinterpret_cast<VECTOR *>(rand_frc); | |||||
| VECTOR *d_out = reinterpret_cast<VECTOR *>(output); | |||||
| MD_Iteration_Leap_Frog_With_LiuJian_kernel<<<ceilf(static_cast<float>(atom_numbers) / 32), 32, 0, stream>>>( | |||||
| atom_numbers, half_dt, dt, exp_gamma, inverse_mass, sqrt_mass_inverse, d_vel, d_crd, d_frc, d_acc, d_rand_frc, | |||||
| d_out); | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #ifndef MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_MD_ITERATION_LEAP_FROG_LIUJIAN_GPU_IMPL_H_ | |||||
| #define MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_MD_ITERATION_LEAP_FROG_LIUJIAN_GPU_IMPL_H_ | |||||
| #include <curand_kernel.h> | |||||
| #include "runtime/device/gpu/cuda_common.h" | |||||
| void MD_Iteration_Leap_Frog_With_LiuJian(const int atom_numbers, const float half_dt, const float dt, | |||||
| const float exp_gamma, int float4_numbers, float *inverse_mass, | |||||
| float *sqrt_mass_inverse, float *vel, float *crd, float *frc, float *acc, | |||||
| curandStatePhilox4_32_10_t *rand_state, float *rand_frc, float *output, | |||||
| cudaStream_t stream); | |||||
| #endif // MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_MD_ITERATION_LEAP_FROG_LIUJIAN_GPU_IMPL_H_ | |||||
| @@ -0,0 +1,28 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/nvtit/md_iteration_setup_random_state_gpu_impl.cuh" | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/util.cuh" | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/common_sponge.cuh" | |||||
| void MD_Iteration_Setup_Random_State(int float4_numbers, curandStatePhilox4_32_10_t *rand_state, int seed, | |||||
| cudaStream_t stream) { | |||||
| Setup_Rand_Normal_Kernel<<<ceilf(static_cast<float>(float4_numbers) / 32.), 32, 0, stream>>>(float4_numbers, | |||||
| rand_state, seed); | |||||
| } | |||||
| void MD_Iteration_Setup_Random_State(int float4_numbers, curandStatePhilox4_32_10_t *rand_state, int seed, | |||||
| cudaStream_t stream); | |||||
| @@ -0,0 +1,23 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #ifndef MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_MD_ITERATION_SETUP_RANDOM_STATE_GPU_IMPL_H_ | |||||
| #define MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_MD_ITERATION_SETUP_RANDOM_STATE_GPU_IMPL_H_ | |||||
| #include <curand_kernel.h> | |||||
| #include "runtime/device/gpu/cuda_common.h" | |||||
| void MD_Iteration_Setup_Random_State(int float4_numbers, curandStatePhilox4_32_10_t *rand_state, int seed, | |||||
| cudaStream_t stream); | |||||
| #endif | |||||
| @@ -93,12 +93,13 @@ __global__ void PME_Excluded_Energy_Correction(const int atom_numbers, const UNS | |||||
| } | } | ||||
| } | } | ||||
| void PMEEnergy(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *box_length_f, float *PME_BC, | |||||
| int *pme_uxyz, float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | |||||
| const int *uint_crd_f, const float *charge, int *nl_atom_numbers, int *nl_atom_serial, int *nl, | |||||
| const float *scaler_f, const int *excluded_list_start, const int *excluded_list, | |||||
| const int *excluded_atom_numbers, float *d_reciprocal_ene, float *d_self_ene, float *d_direct_ene, | |||||
| float *d_correction_ene, cudaStream_t stream) { | |||||
| void PMEEnergy(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *PME_BC, int *pme_uxyz, | |||||
| float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, const int *uint_crd_f, | |||||
| const float *charge, int *nl_atom_numbers, int *nl_atom_serial, int *nl, const float *scaler_f, | |||||
| const int *excluded_list_start, const int *excluded_list, const int *excluded_atom_numbers, | |||||
| float *d_reciprocal_ene, float *d_self_ene, float *d_direct_ene, float *d_correction_ene, | |||||
| dim3 thread_PME, int PME_Nin, int PME_Nfft, int PME_Nall, const cufftHandle &PME_plan_r2c, | |||||
| const cufftHandle &PME_plan_c2r, cudaStream_t stream) { | |||||
| UNSIGNED_INT_VECTOR *uint_crd = | UNSIGNED_INT_VECTOR *uint_crd = | ||||
| const_cast<UNSIGNED_INT_VECTOR *>(reinterpret_cast<const UNSIGNED_INT_VECTOR *>(uint_crd_f)); | const_cast<UNSIGNED_INT_VECTOR *>(reinterpret_cast<const UNSIGNED_INT_VECTOR *>(uint_crd_f)); | ||||
| VECTOR *scaler = const_cast<VECTOR *>(reinterpret_cast<const VECTOR *>(scaler_f)); | VECTOR *scaler = const_cast<VECTOR *>(reinterpret_cast<const VECTOR *>(scaler_f)); | ||||
| @@ -106,97 +107,11 @@ void PMEEnergy(int fftx, int ffty, int fftz, int atom_numbers, float beta, float | |||||
| NEIGHBOR_LIST *nl_a = reinterpret_cast<NEIGHBOR_LIST *>(nl); | NEIGHBOR_LIST *nl_a = reinterpret_cast<NEIGHBOR_LIST *>(nl); | ||||
| construct_neighbor_list_kernel<<<ceilf(static_cast<float>(atom_numbers) / 128), 128, 0, stream>>>( | construct_neighbor_list_kernel<<<ceilf(static_cast<float>(atom_numbers) / 128), 128, 0, stream>>>( | ||||
| atom_numbers, max_neighbor_numbers, nl_atom_numbers, nl_atom_serial, nl_a); | atom_numbers, max_neighbor_numbers, nl_atom_numbers, nl_atom_serial, nl_a); | ||||
| std::vector<float> h_box_length(3); | |||||
| cudaMemcpyAsync(h_box_length.data(), box_length_f, sizeof(float) * h_box_length.size(), cudaMemcpyDeviceToHost, | |||||
| stream); | |||||
| cudaStreamSynchronize(stream); | |||||
| VECTOR *box_length = reinterpret_cast<VECTOR *>(h_box_length.data()); | |||||
| UNSIGNED_INT_VECTOR *PME_uxyz = reinterpret_cast<UNSIGNED_INT_VECTOR *>(pme_uxyz); | UNSIGNED_INT_VECTOR *PME_uxyz = reinterpret_cast<UNSIGNED_INT_VECTOR *>(pme_uxyz); | ||||
| UNSIGNED_INT_VECTOR *PME_kxyz = reinterpret_cast<UNSIGNED_INT_VECTOR *>(pme_kxyz); | UNSIGNED_INT_VECTOR *PME_kxyz = reinterpret_cast<UNSIGNED_INT_VECTOR *>(pme_kxyz); | ||||
| VECTOR *PME_frxyz = reinterpret_cast<VECTOR *>(pme_frxyz); | VECTOR *PME_frxyz = reinterpret_cast<VECTOR *>(pme_frxyz); | ||||
| cufftComplex *PME_FQ = reinterpret_cast<cufftComplex *>(pme_fq); | cufftComplex *PME_FQ = reinterpret_cast<cufftComplex *>(pme_fq); | ||||
| cufftHandle PME_plan_r2c; | |||||
| cufftHandle PME_plan_c2r; | |||||
| cufftPlan3d(&PME_plan_r2c, fftx, ffty, fftz, CUFFT_R2C); | |||||
| cufftPlan3d(&PME_plan_c2r, fftx, ffty, fftz, CUFFT_C2R); | |||||
| cufftSetStream(PME_plan_r2c, stream); | |||||
| cufftSetStream(PME_plan_c2r, stream); | |||||
| thread_PME.x = 8; | |||||
| thread_PME.y = 8; | |||||
| int PME_Nin = ffty * fftz; | |||||
| int PME_Nfft = fftx * ffty * (fftz / 2 + 1); | |||||
| int PME_Nall = fftx * ffty * fftz; | |||||
| float volume = box_length[0].x * box_length[0].y * box_length[0].z; | |||||
| UNSIGNED_INT_VECTOR *PME_kxyz_cpu; | |||||
| Malloc_Safely(reinterpret_cast<void **>(&PME_kxyz_cpu), sizeof(UNSIGNED_INT_VECTOR) * 64); | |||||
| int kx, ky, kz, kxrp, kyrp, kzrp, index; | |||||
| for (kx = 0; kx < 4; kx++) { | |||||
| for (ky = 0; ky < 4; ky++) { | |||||
| for (kz = 0; kz < 4; kz++) { | |||||
| index = kx * 16 + ky * 4 + kz; | |||||
| PME_kxyz_cpu[index].uint_x = kx; | |||||
| PME_kxyz_cpu[index].uint_y = ky; | |||||
| PME_kxyz_cpu[index].uint_z = kz; | |||||
| } | |||||
| } | |||||
| } | |||||
| cudaMemcpyAsync(PME_kxyz, PME_kxyz_cpu, sizeof(UNSIGNED_INT_VECTOR) * 64, cudaMemcpyHostToDevice, stream); | |||||
| cudaStreamSynchronize(stream); | |||||
| free(PME_kxyz_cpu); | |||||
| // initial start | |||||
| float *B1, *B2, *B3, *PME_BC0; | |||||
| B1 = reinterpret_cast<float *>(malloc(sizeof(float) * fftx)); | |||||
| B2 = reinterpret_cast<float *>(malloc(sizeof(float) * ffty)); | |||||
| B3 = reinterpret_cast<float *>(malloc(sizeof(float) * fftz)); | |||||
| PME_BC0 = reinterpret_cast<float *>(malloc(sizeof(float) * PME_Nfft)); | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| B1[kx] = getb(kx, fftx, 4); | |||||
| } | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| B2[ky] = getb(ky, ffty, 4); | |||||
| } | |||||
| for (kz = 0; kz < fftz; kz++) { | |||||
| B3[kz] = getb(kz, fftz, 4); | |||||
| } | |||||
| float mprefactor = PI * PI / -beta / beta; | |||||
| float msq; | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| kxrp = kx; | |||||
| if (kx > fftx / 2) kxrp = fftx - kx; | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| kyrp = ky; | |||||
| if (ky > ffty / 2) kyrp = ffty - ky; | |||||
| for (kz = 0; kz <= fftz / 2; kz++) { | |||||
| kzrp = kz; | |||||
| msq = kxrp * kxrp / box_length[0].x / box_length[0].x + kyrp * kyrp / box_length[0].y / box_length[0].y + | |||||
| kzrp * kzrp / box_length[0].z / box_length[0].z; | |||||
| index = kx * ffty * (fftz / 2 + 1) + ky * (fftz / 2 + 1) + kz; | |||||
| if ((kx + ky + kz) == 0) { | |||||
| PME_BC0[index] = 0; | |||||
| } else { | |||||
| PME_BC0[index] = 1.0 / PI / msq * exp(mprefactor * msq) / volume; | |||||
| } | |||||
| PME_BC0[index] *= B1[kx] * B2[ky] * B3[kz]; | |||||
| } | |||||
| } | |||||
| } | |||||
| cudaMemcpyAsync(PME_BC, PME_BC0, sizeof(float) * PME_Nfft, cudaMemcpyHostToDevice, stream); | |||||
| cudaStreamSynchronize(stream); | |||||
| free(B1); | |||||
| free(B2); | |||||
| free(B3); | |||||
| free(PME_BC0); | |||||
| Reset_List<<<3 * atom_numbers / 32 + 1, 32, 0, stream>>>(3 * atom_numbers, reinterpret_cast<int *>(PME_uxyz), | Reset_List<<<3 * atom_numbers / 32 + 1, 32, 0, stream>>>(3 * atom_numbers, reinterpret_cast<int *>(PME_uxyz), | ||||
| 1 << 30); | 1 << 30); | ||||
| @@ -226,9 +141,3 @@ void PMEEnergy(int fftx, int ffty, int fftz, int atom_numbers, float beta, float | |||||
| d_correction_ene); | d_correction_ene); | ||||
| return; | return; | ||||
| } | } | ||||
| void PMEEnergy(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *box_length_f, float *PME_BC, | |||||
| int *pme_uxyz, float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | |||||
| const int *uint_crd_f, const float *charge, int *nl_atom_numbers, int *nl_atom_serial, int *nl, | |||||
| const float *scaler_f, const int *excluded_list_start, const int *excluded_list, | |||||
| const int *excluded_atom_numbers, float *d_reciprocal_ene, float *d_self_ene, float *d_direct_ene, | |||||
| float *d_correction_ene, cudaStream_t stream); | |||||
| @@ -16,15 +16,15 @@ | |||||
| #ifndef MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_ENERGY_IMPL_H_ | #ifndef MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_ENERGY_IMPL_H_ | ||||
| #define MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_ENERGY_IMPL_H_ | #define MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_ENERGY_IMPL_H_ | ||||
| #include <curand_kernel.h> | |||||
| #include <vector> | |||||
| #include <cufft.h> | |||||
| #include "runtime/device/gpu/cuda_common.h" | #include "runtime/device/gpu/cuda_common.h" | ||||
| void PMEEnergy(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *box_length_f, float *PME_BC, | |||||
| int *pme_uxyz, float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | |||||
| const int *uint_crd_f, const float *charge, int *nl_atom_numbers, int *nl_atom_serial, int *nl, | |||||
| const float *scaler_f, const int *excluded_list_start, const int *excluded_list, | |||||
| const int *excluded_atom_numbers, float *d_reciprocal_ene, float *d_self_ene, float *d_direct_ene, | |||||
| float *d_correction_ene, cudaStream_t stream); | |||||
| void PMEEnergy(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *PME_BC, int *pme_uxyz, | |||||
| float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, const int *uint_crd_f, | |||||
| const float *charge, int *nl_atom_numbers, int *nl_atom_serial, int *nl, const float *scaler_f, | |||||
| const int *excluded_list_start, const int *excluded_list, const int *excluded_atom_numbers, | |||||
| float *d_reciprocal_ene, float *d_self_ene, float *d_direct_ene, float *d_correction_ene, | |||||
| dim3 thread_PME, int PME_Nin, int PME_Nfft, int PME_Nall, const cufftHandle &PME_plan_r2c, | |||||
| const cufftHandle &PME_plan_c2r, cudaStream_t stream); | |||||
| #endif | #endif | ||||
| @@ -28,7 +28,7 @@ __global__ void PME_BCFQ(cufftComplex *PME_FQ, float *PME_BC, int PME_Nfft) { | |||||
| __global__ void PME_Final(int *PME_atom_near, const float *charge, const float *PME_Q, VECTOR *force, | __global__ void PME_Final(int *PME_atom_near, const float *charge, const float *PME_Q, VECTOR *force, | ||||
| const VECTOR *PME_frxyz, const UNSIGNED_INT_VECTOR *PME_kxyz, | const VECTOR *PME_frxyz, const UNSIGNED_INT_VECTOR *PME_kxyz, | ||||
| const VECTOR PME_inverse_box_vector, const int atom_numbers) { | |||||
| const _VECTOR PME_inverse_box_vector, const int atom_numbers) { | |||||
| int atom = blockDim.x * blockIdx.x + threadIdx.x; | int atom = blockDim.x * blockIdx.x + threadIdx.x; | ||||
| if (atom < atom_numbers) { | if (atom < atom_numbers) { | ||||
| int k, kx; | int k, kx; | ||||
| @@ -73,8 +73,9 @@ __global__ void PME_Final(int *PME_atom_near, const float *charge, const float * | |||||
| void PMEReciprocalForce(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *PME_BC, int *pme_uxyz, | void PMEReciprocalForce(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *PME_BC, int *pme_uxyz, | ||||
| float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | ||||
| const float *box_length_f, const int *uint_crd_f, const float *charge, float *force, | |||||
| cudaStream_t stream) { | |||||
| const int *uint_crd_f, const float *charge, float *force, int PME_Nin, int PME_Nall, | |||||
| int PME_Nfft, const cufftHandle &PME_plan_r2c, const cufftHandle &PME_plan_c2r, | |||||
| const _VECTOR &PME_inverse_box_vector, cudaStream_t stream) { | |||||
| Reset_List<<<ceilf(static_cast<float>(3. * atom_numbers) / 128), 128, 0, stream>>>(3 * atom_numbers, force, 0.); | Reset_List<<<ceilf(static_cast<float>(3. * atom_numbers) / 128), 128, 0, stream>>>(3 * atom_numbers, force, 0.); | ||||
| UNSIGNED_INT_VECTOR *uint_crd = | UNSIGNED_INT_VECTOR *uint_crd = | ||||
| const_cast<UNSIGNED_INT_VECTOR *>(reinterpret_cast<const UNSIGNED_INT_VECTOR *>(uint_crd_f)); | const_cast<UNSIGNED_INT_VECTOR *>(reinterpret_cast<const UNSIGNED_INT_VECTOR *>(uint_crd_f)); | ||||
| @@ -86,98 +87,8 @@ void PMEReciprocalForce(int fftx, int ffty, int fftz, int atom_numbers, float be | |||||
| VECTOR *PME_frxyz = reinterpret_cast<VECTOR *>(pme_frxyz); | VECTOR *PME_frxyz = reinterpret_cast<VECTOR *>(pme_frxyz); | ||||
| VECTOR *frc = reinterpret_cast<VECTOR *>(force); | VECTOR *frc = reinterpret_cast<VECTOR *>(force); | ||||
| std::vector<float> h_box_length(3); | |||||
| cudaMemcpyAsync(h_box_length.data(), box_length_f, sizeof(float) * h_box_length.size(), cudaMemcpyDeviceToHost, | |||||
| stream); | |||||
| cudaStreamSynchronize(stream); | |||||
| VECTOR *box_length = const_cast<VECTOR *>(reinterpret_cast<const VECTOR *>(h_box_length.data())); | |||||
| cufftComplex *PME_FQ = reinterpret_cast<cufftComplex *>(pme_fq); | cufftComplex *PME_FQ = reinterpret_cast<cufftComplex *>(pme_fq); | ||||
| VECTOR PME_inverse_box_vector; | |||||
| PME_inverse_box_vector.x = static_cast<float>(fftx) / box_length[0].x; | |||||
| PME_inverse_box_vector.y = static_cast<float>(ffty) / box_length[0].y; | |||||
| PME_inverse_box_vector.z = static_cast<float>(fftz) / box_length[0].z; | |||||
| cufftHandle PME_plan_r2c; | |||||
| cufftHandle PME_plan_c2r; | |||||
| cufftPlan3d(&PME_plan_r2c, fftx, ffty, fftz, CUFFT_R2C); | |||||
| cufftPlan3d(&PME_plan_c2r, fftx, ffty, fftz, CUFFT_C2R); | |||||
| cufftSetStream(PME_plan_r2c, stream); | |||||
| cufftSetStream(PME_plan_c2r, stream); | |||||
| thread_PME.x = 8; | |||||
| thread_PME.y = 8; | |||||
| int PME_Nin = ffty * fftz; | |||||
| int PME_Nfft = fftx * ffty * (fftz / 2 + 1); | |||||
| int PME_Nall = fftx * ffty * fftz; | |||||
| float volume = box_length[0].x * box_length[0].y * box_length[0].z; | |||||
| UNSIGNED_INT_VECTOR *PME_kxyz_cpu; | |||||
| Malloc_Safely(reinterpret_cast<void **>(&PME_kxyz_cpu), sizeof(UNSIGNED_INT_VECTOR) * 64); | |||||
| int kx, ky, kz, kxrp, kyrp, kzrp, index; | |||||
| for (kx = 0; kx < 4; kx++) { | |||||
| for (ky = 0; ky < 4; ky++) { | |||||
| for (kz = 0; kz < 4; kz++) { | |||||
| index = kx * 16 + ky * 4 + kz; | |||||
| PME_kxyz_cpu[index].uint_x = kx; | |||||
| PME_kxyz_cpu[index].uint_y = ky; | |||||
| PME_kxyz_cpu[index].uint_z = kz; | |||||
| } | |||||
| } | |||||
| } | |||||
| cudaMemcpyAsync(PME_kxyz, PME_kxyz_cpu, sizeof(UNSIGNED_INT_VECTOR) * 64, cudaMemcpyHostToDevice, stream); | |||||
| cudaStreamSynchronize(stream); | |||||
| free(PME_kxyz_cpu); | |||||
| // initial start | |||||
| float *B1, *B2, *B3, *PME_BC0; | |||||
| B1 = reinterpret_cast<float *>(malloc(sizeof(float) * fftx)); | |||||
| B2 = reinterpret_cast<float *>(malloc(sizeof(float) * ffty)); | |||||
| B3 = reinterpret_cast<float *>(malloc(sizeof(float) * fftz)); | |||||
| PME_BC0 = reinterpret_cast<float *>(malloc(sizeof(float) * PME_Nfft)); | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| B1[kx] = getb(kx, fftx, 4); | |||||
| } | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| B2[ky] = getb(ky, ffty, 4); | |||||
| } | |||||
| for (kz = 0; kz < fftz; kz++) { | |||||
| B3[kz] = getb(kz, fftz, 4); | |||||
| } | |||||
| float mprefactor = PI * PI / -beta / beta; | |||||
| float msq; | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| kxrp = kx; | |||||
| if (kx > fftx / 2) kxrp = fftx - kx; | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| kyrp = ky; | |||||
| if (ky > ffty / 2) kyrp = ffty - ky; | |||||
| for (kz = 0; kz <= fftz / 2; kz++) { | |||||
| kzrp = kz; | |||||
| msq = kxrp * kxrp / box_length[0].x / box_length[0].x + kyrp * kyrp / box_length[0].y / box_length[0].y + | |||||
| kzrp * kzrp / box_length[0].z / box_length[0].z; | |||||
| index = kx * ffty * (fftz / 2 + 1) + ky * (fftz / 2 + 1) + kz; | |||||
| if ((kx + ky + kz) == 0) { | |||||
| PME_BC0[index] = 0; | |||||
| } else { | |||||
| PME_BC0[index] = 1.0 / PI / msq * exp(mprefactor * msq) / volume; | |||||
| } | |||||
| PME_BC0[index] *= B1[kx] * B2[ky] * B3[kz]; | |||||
| } | |||||
| } | |||||
| } | |||||
| cudaMemcpyAsync(PME_BC, PME_BC0, sizeof(float) * PME_Nfft, cudaMemcpyHostToDevice, stream); | |||||
| cudaStreamSynchronize(stream); | |||||
| free(B1); | |||||
| free(B2); | |||||
| free(B3); | |||||
| free(PME_BC0); | |||||
| // initial end | // initial end | ||||
| Reset_List<<<ceilf(static_cast<float>(3. * atom_numbers) / 128), 128, 0, stream>>>( | Reset_List<<<ceilf(static_cast<float>(3. * atom_numbers) / 128), 128, 0, stream>>>( | ||||
| 3 * atom_numbers, reinterpret_cast<float *>(frc), 0.); | 3 * atom_numbers, reinterpret_cast<float *>(frc), 0.); | ||||
| @@ -198,8 +109,3 @@ void PMEReciprocalForce(int fftx, int ffty, int fftz, int atom_numbers, float be | |||||
| PME_kxyz, PME_inverse_box_vector, atom_numbers); | PME_kxyz, PME_inverse_box_vector, atom_numbers); | ||||
| return; | return; | ||||
| } | } | ||||
| void PMEReciprocalForce(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *PME_BC, int *pme_uxyz, | |||||
| float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | |||||
| const float *box_length_f, const int *uint_crd_f, const float *charge, float *force, | |||||
| cudaStream_t stream); | |||||
| @@ -16,13 +16,18 @@ | |||||
| #ifndef MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_RECIPROCAL_FORCE_IMPL_H_ | #ifndef MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_RECIPROCAL_FORCE_IMPL_H_ | ||||
| #define MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_RECIPROCAL_FORCE_IMPL_H_ | #define MINDSPORE_CCSRC_KERNEL_GPU_CUDA_IMPL_SPONGE_PME_PME_RECIPROCAL_FORCE_IMPL_H_ | ||||
| #include <curand_kernel.h> | |||||
| #include <vector> | |||||
| #include <cufft.h> | |||||
| #include "runtime/device/gpu/cuda_common.h" | #include "runtime/device/gpu/cuda_common.h" | ||||
| struct _VECTOR { | |||||
| float x; | |||||
| float y; | |||||
| float z; | |||||
| }; | |||||
| void PMEReciprocalForce(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *PME_BC, int *pme_uxyz, | void PMEReciprocalForce(int fftx, int ffty, int fftz, int atom_numbers, float beta, float *PME_BC, int *pme_uxyz, | ||||
| float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | float *pme_frxyz, float *PME_Q, float *pme_fq, int *PME_atom_near, int *pme_kxyz, | ||||
| const float *box_length_f, const int *uint_crd_f, const float *charge, float *force, | |||||
| cudaStream_t stream); | |||||
| const int *uint_crd_f, const float *charge, float *force, int PME_Nin, int PME_Nall, | |||||
| int PME_Nfft, const cufftHandle &PME_plan_r2c, const cufftHandle &PME_plan_c2r, | |||||
| const _VECTOR &PME_inverse_box_vector, cudaStream_t stream); | |||||
| #endif | #endif | ||||
| @@ -0,0 +1,27 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #include "backend/kernel_compiler/gpu/sponge/common/crd_to_uint_crd_kernel.h" | |||||
| namespace mindspore { | |||||
| namespace kernel { | |||||
| MS_REG_GPU_KERNEL_TWO( | |||||
| CrdToUintCrd, | |||||
| KernelAttr().AddInputAttr(kNumberTypeFloat32).AddInputAttr(kNumberTypeFloat32).AddOutputAttr(kNumberTypeUInt32), | |||||
| CrdToUintCrdGpuKernel, float, unsigned int) | |||||
| } // namespace kernel | |||||
| } // namespace mindspore | |||||
| @@ -0,0 +1,87 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #ifndef MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_SPONG_COMMON_CRD_TO_UINT_CRD_KERNEL_H_ | |||||
| #define MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_SPONG_COMMON_CRD_TO_UINT_CRD_KERNEL_H_ | |||||
| #include <cuda_runtime_api.h> | |||||
| #include <vector> | |||||
| #include <string> | |||||
| #include <map> | |||||
| #include "backend/kernel_compiler/gpu/gpu_kernel.h" | |||||
| #include "backend/kernel_compiler/gpu/gpu_kernel_factory.h" | |||||
| #include "runtime/device/gpu/cuda_common.h" | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/common/crd_to_uint_crd_impl.cuh" | |||||
| namespace mindspore { | |||||
| namespace kernel { | |||||
| template <typename T, typename T1> | |||||
| class CrdToUintCrdGpuKernel : public GpuKernel { | |||||
| public: | |||||
| CrdToUintCrdGpuKernel() : ele_crd(1) {} | |||||
| ~CrdToUintCrdGpuKernel() override = default; | |||||
| bool Init(const CNodePtr &kernel_node) override { | |||||
| kernel_node_ = kernel_node; | |||||
| atom_numbers = static_cast<int>(GetAttr<int64_t>(kernel_node, "atom_numbers")); | |||||
| auto shape_crd_to_uint_crd_cof = AnfAlgo::GetPrevNodeOutputInferShape(kernel_node, 0); | |||||
| auto shape_crd = AnfAlgo::GetPrevNodeOutputInferShape(kernel_node, 1); | |||||
| for (size_t i = 0; i < shape_crd_to_uint_crd_cof.size(); i++) | |||||
| ele_crd_to_uint_crd_cof *= shape_crd_to_uint_crd_cof[i]; | |||||
| for (size_t i = 0; i < shape_crd.size(); i++) ele_crd *= shape_crd[i]; | |||||
| InitSizeLists(); | |||||
| return true; | |||||
| } | |||||
| const std::vector<size_t> &GetInputSizeList() const override { return input_size_list_; } | |||||
| const std::vector<size_t> &GetOutputSizeList() const override { return output_size_list_; } | |||||
| const std::vector<size_t> &GetWorkspaceSizeList() const override { return workspace_size_list_; } | |||||
| bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &, | |||||
| const std::vector<AddressPtr> &outputs, void *stream_ptr) override { | |||||
| auto crd_to_uint_crd_cof = GetDeviceAddress<const T>(inputs, 0); | |||||
| auto crd = GetDeviceAddress<const T>(inputs, 1); | |||||
| auto uint_crd = GetDeviceAddress<T1>(outputs, 0); | |||||
| CrdToUintCrd(atom_numbers, crd_to_uint_crd_cof, crd, uint_crd, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| return true; | |||||
| } | |||||
| protected: | |||||
| void InitSizeLists() override { | |||||
| input_size_list_.push_back(ele_crd_to_uint_crd_cof * sizeof(T)); | |||||
| input_size_list_.push_back(ele_crd * sizeof(T)); | |||||
| output_size_list_.push_back(3 * atom_numbers * sizeof(T)); | |||||
| } | |||||
| private: | |||||
| size_t ele_crd_to_uint_crd_cof = 1; | |||||
| size_t ele_crd = 1; | |||||
| std::vector<size_t> input_size_list_; | |||||
| std::vector<size_t> output_size_list_; | |||||
| std::vector<size_t> workspace_size_list_; | |||||
| int atom_numbers; | |||||
| }; | |||||
| } // namespace kernel | |||||
| } // namespace mindspore | |||||
| #endif // MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_SPONG_COMMON_CRD_TO_UINT_CRD_KERNEL_H_ | |||||
| @@ -38,6 +38,7 @@ MS_REG_GPU_KERNEL_TWO(NeighborListUpdate, | |||||
| .AddInputAttr(kNumberTypeInt32) | .AddInputAttr(kNumberTypeInt32) | ||||
| .AddInputAttr(kNumberTypeInt32) | .AddInputAttr(kNumberTypeInt32) | ||||
| .AddInputAttr(kNumberTypeInt32) | .AddInputAttr(kNumberTypeInt32) | ||||
| .AddInputAttr(kNumberTypeInt32) | |||||
| .AddOutputAttr(kNumberTypeFloat32), | .AddOutputAttr(kNumberTypeFloat32), | ||||
| NeighborListUpdateGpuKernel, int, float) | NeighborListUpdateGpuKernel, int, float) | ||||
| @@ -36,7 +36,6 @@ class NeighborListUpdateGpuKernel : public GpuKernel { | |||||
| bool Init(const CNodePtr &kernel_node) override { | bool Init(const CNodePtr &kernel_node) override { | ||||
| grid_numbers = static_cast<int>(GetAttr<int64_t>(kernel_node, "grid_numbers")); | grid_numbers = static_cast<int>(GetAttr<int64_t>(kernel_node, "grid_numbers")); | ||||
| atom_numbers = static_cast<int>(GetAttr<int64_t>(kernel_node, "atom_numbers")); | atom_numbers = static_cast<int>(GetAttr<int64_t>(kernel_node, "atom_numbers")); | ||||
| refresh_count = static_cast<int>(GetAttr<int64_t>(kernel_node, "refresh_count")); | |||||
| refresh_interval = static_cast<int>(GetAttr<int64_t>(kernel_node, "refresh_interval")); | refresh_interval = static_cast<int>(GetAttr<int64_t>(kernel_node, "refresh_interval")); | ||||
| not_first_time = static_cast<int>(GetAttr<int64_t>(kernel_node, "not_first_time")); | not_first_time = static_cast<int>(GetAttr<int64_t>(kernel_node, "not_first_time")); | ||||
| Nxy = static_cast<int>(GetAttr<int64_t>(kernel_node, "Nxy")); | Nxy = static_cast<int>(GetAttr<int64_t>(kernel_node, "Nxy")); | ||||
| @@ -47,7 +46,8 @@ class NeighborListUpdateGpuKernel : public GpuKernel { | |||||
| cutoff_with_skin = static_cast<float>(GetAttr<float>(kernel_node, "cutoff_with_skin")); | cutoff_with_skin = static_cast<float>(GetAttr<float>(kernel_node, "cutoff_with_skin")); | ||||
| half_cutoff_with_skin = static_cast<float>(GetAttr<float>(kernel_node, "half_cutoff_with_skin")); | half_cutoff_with_skin = static_cast<float>(GetAttr<float>(kernel_node, "half_cutoff_with_skin")); | ||||
| cutoff_with_skin_square = static_cast<float>(GetAttr<float>(kernel_node, "cutoff_with_skin_square")); | cutoff_with_skin_square = static_cast<float>(GetAttr<float>(kernel_node, "cutoff_with_skin_square")); | ||||
| h_bucket.resize(grid_numbers); | |||||
| h_gpointer.resize(grid_numbers); | |||||
| InitSizeLists(); | InitSizeLists(); | ||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -76,17 +76,18 @@ class NeighborListUpdateGpuKernel : public GpuKernel { | |||||
| auto excluded_list = GetDeviceAddress<int>(inputs, 15); | auto excluded_list = GetDeviceAddress<int>(inputs, 15); | ||||
| auto excluded_numbers = GetDeviceAddress<int>(inputs, 16); | auto excluded_numbers = GetDeviceAddress<int>(inputs, 16); | ||||
| auto need_refresh_flag = GetDeviceAddress<int>(inputs, 17); | auto need_refresh_flag = GetDeviceAddress<int>(inputs, 17); | ||||
| auto d_refresh_count = GetDeviceAddress<int>(inputs, 18); | |||||
| GRID_BUCKET *d_bucket = reinterpret_cast<GRID_BUCKET *>(GetDeviceAddress<int>(workspaces, 0)); | GRID_BUCKET *d_bucket = reinterpret_cast<GRID_BUCKET *>(GetDeviceAddress<int>(workspaces, 0)); | ||||
| GRID_POINTER *d_gpointer = reinterpret_cast<GRID_POINTER *>(GetDeviceAddress<int>(workspaces, 1)); | GRID_POINTER *d_gpointer = reinterpret_cast<GRID_POINTER *>(GetDeviceAddress<int>(workspaces, 1)); | ||||
| NEIGHBOR_LIST *nl = GetDeviceAddress<NEIGHBOR_LIST>(workspaces, 2); | NEIGHBOR_LIST *nl = GetDeviceAddress<NEIGHBOR_LIST>(workspaces, 2); | ||||
| float *half_crd_to_uint_crd_cof = GetDeviceAddress<float>(workspaces, 3); | float *half_crd_to_uint_crd_cof = GetDeviceAddress<float>(workspaces, 3); | ||||
| std::vector<GRID_BUCKET> h_bucket(grid_numbers); | |||||
| // std::vector<GRID_BUCKET> h_bucket(grid_numbers); | |||||
| for (size_t i = 0; i < h_bucket.size(); i += 1) { | for (size_t i = 0; i < h_bucket.size(); i += 1) { | ||||
| h_bucket[i].atom_serial = bucket + i * max_atom_in_grid_numbers; | h_bucket[i].atom_serial = bucket + i * max_atom_in_grid_numbers; | ||||
| } | } | ||||
| std::vector<GRID_POINTER> h_gpointer(grid_numbers); | |||||
| // std::vector<GRID_POINTER> h_gpointer(grid_numbers); | |||||
| for (size_t i = 0; i < h_gpointer.size(); i += 1) { | for (size_t i = 0; i < h_gpointer.size(); i += 1) { | ||||
| h_gpointer[i].grid_serial = gpointer + i * 125; | h_gpointer[i].grid_serial = gpointer + i * 125; | ||||
| } | } | ||||
| @@ -98,7 +99,7 @@ class NeighborListUpdateGpuKernel : public GpuKernel { | |||||
| Construct_Neighbor_List(atom_numbers, max_neighbor_numbers, nl_atom_numbers, nl_atom_serial, nl, | Construct_Neighbor_List(atom_numbers, max_neighbor_numbers, nl_atom_numbers, nl_atom_serial, nl, | ||||
| reinterpret_cast<cudaStream_t>(stream_ptr)); | reinterpret_cast<cudaStream_t>(stream_ptr)); | ||||
| Neighbor_List_Update(grid_numbers, atom_numbers, refresh_count, refresh_interval, not_first_time, skin, Nxy, | |||||
| Neighbor_List_Update(grid_numbers, atom_numbers, d_refresh_count, refresh_interval, not_first_time, skin, Nxy, | |||||
| cutoff_square, cutoff_with_skin_square, grid_N, box_length, atom_numbers_in_grid_bucket, | cutoff_square, cutoff_with_skin_square, grid_N, box_length, atom_numbers_in_grid_bucket, | ||||
| grid_length_inverse, atom_in_grid_serial, d_bucket, crd, old_crd, crd_to_uint_crd_cof, | grid_length_inverse, atom_in_grid_serial, d_bucket, crd, old_crd, crd_to_uint_crd_cof, | ||||
| half_crd_to_uint_crd_cof, uint_crd, uint_dr_to_dr_cof, d_gpointer, nl, excluded_list_start, | half_crd_to_uint_crd_cof, uint_crd, uint_dr_to_dr_cof, d_gpointer, nl, excluded_list_start, | ||||
| @@ -132,6 +133,7 @@ class NeighborListUpdateGpuKernel : public GpuKernel { | |||||
| input_size_list_.push_back(sizeof(int) * excluded_atom_numbers); | input_size_list_.push_back(sizeof(int) * excluded_atom_numbers); | ||||
| input_size_list_.push_back(sizeof(int) * atom_numbers); | input_size_list_.push_back(sizeof(int) * atom_numbers); | ||||
| input_size_list_.push_back(sizeof(int)); | |||||
| input_size_list_.push_back(sizeof(int)); | input_size_list_.push_back(sizeof(int)); | ||||
| workspace_size_list_.push_back(sizeof(GRID_BUCKET) * grid_numbers); | workspace_size_list_.push_back(sizeof(GRID_BUCKET) * grid_numbers); | ||||
| @@ -148,7 +150,6 @@ class NeighborListUpdateGpuKernel : public GpuKernel { | |||||
| int not_first_time; | int not_first_time; | ||||
| int atom_numbers; | int atom_numbers; | ||||
| int grid_numbers; | int grid_numbers; | ||||
| int refresh_count; | |||||
| int refresh_interval; | int refresh_interval; | ||||
| int Nxy; | int Nxy; | ||||
| int max_atom_in_grid_numbers; | int max_atom_in_grid_numbers; | ||||
| @@ -163,6 +164,8 @@ class NeighborListUpdateGpuKernel : public GpuKernel { | |||||
| std::vector<size_t> input_size_list_; | std::vector<size_t> input_size_list_; | ||||
| std::vector<size_t> output_size_list_; | std::vector<size_t> output_size_list_; | ||||
| std::vector<size_t> workspace_size_list_; | std::vector<size_t> workspace_size_list_; | ||||
| std::vector<GRID_BUCKET> h_bucket; | |||||
| std::vector<GRID_POINTER> h_gpointer; | |||||
| }; | }; | ||||
| } // namespace kernel | } // namespace kernel | ||||
| } // namespace mindspore | } // namespace mindspore | ||||
| @@ -45,14 +45,6 @@ class MDIterationLeapFrogGpuKernel : public GpuKernel { | |||||
| is_max_velocity = static_cast<int>(GetAttr<int64_t>(kernel_node, "is_max_velocity")); | is_max_velocity = static_cast<int>(GetAttr<int64_t>(kernel_node, "is_max_velocity")); | ||||
| max_velocity = static_cast<float>(GetAttr<float>(kernel_node, "max_velocity")); | max_velocity = static_cast<float>(GetAttr<float>(kernel_node, "max_velocity")); | ||||
| // printf("float4_numbers: %d", float4_numbers); | |||||
| // printf("atom_numbers: %d", atom_numbers); | |||||
| // printf("half_dt: %f", half_dt); | |||||
| // printf("dt: %f", dt); | |||||
| // printf("exp_gamma: %f", exp_gamma); | |||||
| // printf("is_max_velocity: %d", is_max_velocity); | |||||
| // printf("max_velocity: %f", max_velocity); | |||||
| auto shape_mass_inverse = AnfAlgo::GetPrevNodeOutputInferShape(kernel_node, 0); | auto shape_mass_inverse = AnfAlgo::GetPrevNodeOutputInferShape(kernel_node, 0); | ||||
| auto shape_qrt_mass = AnfAlgo::GetPrevNodeOutputInferShape(kernel_node, 1); | auto shape_qrt_mass = AnfAlgo::GetPrevNodeOutputInferShape(kernel_node, 1); | ||||
| @@ -0,0 +1,35 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #include "backend/kernel_compiler/gpu/sponge/nvtit/md_iteration_leap_frog_liujian_gpu_kernel.h" | |||||
| namespace mindspore { | |||||
| namespace kernel { | |||||
| MS_REG_GPU_KERNEL_TWO(MDIterationLeapFrogLiujian, | |||||
| KernelAttr() | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddOutputAttr(kNumberTypeFloat32), | |||||
| MDIterationLeapFrogLiujianCudaGpuKernel, float, int) | |||||
| } // namespace kernel | |||||
| } // namespace mindspore | |||||
| @@ -0,0 +1,100 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #ifndef MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_MD_ITERATION_LEAP_FROG_LIUJIAN_GPU_KERNEL_H_ | |||||
| #define MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_MD_ITERATION_LEAP_FROG_LIUJIAN_GPU_KERNEL_H_ | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/nvtit/md_iteration_leap_frog_liujian_gpu_impl.cuh" | |||||
| #include <cuda_runtime_api.h> | |||||
| #include <map> | |||||
| #include <string> | |||||
| #include <vector> | |||||
| #include "backend/kernel_compiler/gpu/gpu_kernel.h" | |||||
| #include "backend/kernel_compiler/gpu/gpu_kernel_factory.h" | |||||
| #include "runtime/device/gpu/cuda_common.h" | |||||
| namespace mindspore { | |||||
| namespace kernel { | |||||
| template <typename T, typename T1> | |||||
| class MDIterationLeapFrogLiujianCudaGpuKernel : public GpuKernel { | |||||
| public: | |||||
| MDIterationLeapFrogLiujianCudaGpuKernel() {} | |||||
| ~MDIterationLeapFrogLiujianCudaGpuKernel() override = default; | |||||
| bool Init(const CNodePtr &kernel_node) override { | |||||
| // get bond_numbers | |||||
| kernel_node_ = kernel_node; | |||||
| atom_numbers = static_cast<int>(GetAttr<int64_t>(kernel_node, "atom_numbers")); | |||||
| half_dt = static_cast<float>(GetAttr<float>(kernel_node, "half_dt")); | |||||
| dt = static_cast<float>(GetAttr<float>(kernel_node, "dt")); | |||||
| exp_gamma = static_cast<float>(GetAttr<float>(kernel_node, "exp_gamma")); | |||||
| float4_numbers = ceil(3. * static_cast<double>(atom_numbers) / 4.); | |||||
| InitSizeLists(); | |||||
| return true; | |||||
| } | |||||
| const std::vector<size_t> &GetInputSizeList() const override { return input_size_list_; } | |||||
| const std::vector<size_t> &GetOutputSizeList() const override { return output_size_list_; } | |||||
| const std::vector<size_t> &GetWorkspaceSizeList() const override { return workspace_size_list_; } | |||||
| bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &workspace, | |||||
| const std::vector<AddressPtr> &outputs, void *stream_ptr) override { | |||||
| auto inverse_mass = GetDeviceAddress<float>(inputs, 0); | |||||
| auto sqrt_mass_inverse = GetDeviceAddress<float>(inputs, 1); | |||||
| auto vel = GetDeviceAddress<float>(inputs, 2); | |||||
| auto crd = GetDeviceAddress<float>(inputs, 3); | |||||
| auto frc = GetDeviceAddress<float>(inputs, 4); | |||||
| auto acc = GetDeviceAddress<float>(inputs, 5); | |||||
| auto rand_state = GetDeviceAddress<float>(inputs, 6); | |||||
| auto rand_frc = GetDeviceAddress<float>(inputs, 7); | |||||
| auto output = GetDeviceAddress<float>(outputs, 0); | |||||
| MD_Iteration_Leap_Frog_With_LiuJian(atom_numbers, half_dt, dt, exp_gamma, float4_numbers, inverse_mass, | |||||
| sqrt_mass_inverse, vel, crd, frc, acc, | |||||
| reinterpret_cast<curandStatePhilox4_32_10_t *>(rand_state), rand_frc, output, | |||||
| reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| return true; | |||||
| } | |||||
| protected: | |||||
| void InitSizeLists() override { | |||||
| input_size_list_.push_back(atom_numbers * sizeof(float)); | |||||
| input_size_list_.push_back(atom_numbers * sizeof(float)); | |||||
| input_size_list_.push_back(atom_numbers * 3 * sizeof(float)); | |||||
| input_size_list_.push_back(atom_numbers * 3 * sizeof(float)); | |||||
| input_size_list_.push_back(atom_numbers * 3 * sizeof(float)); | |||||
| input_size_list_.push_back(atom_numbers * 3 * sizeof(float)); | |||||
| input_size_list_.push_back(float4_numbers * sizeof(curandStatePhilox4_32_10_t)); | |||||
| input_size_list_.push_back(atom_numbers * 3 * sizeof(float)); | |||||
| output_size_list_.push_back(atom_numbers * 3 * sizeof(T)); | |||||
| } | |||||
| private: | |||||
| std::vector<size_t> input_size_list_; | |||||
| std::vector<size_t> output_size_list_; | |||||
| std::vector<size_t> workspace_size_list_; | |||||
| int atom_numbers; | |||||
| float half_dt; | |||||
| float dt; | |||||
| float exp_gamma; | |||||
| int float4_numbers; | |||||
| }; | |||||
| } // namespace kernel | |||||
| } // namespace mindspore | |||||
| #endif | |||||
| @@ -0,0 +1,25 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #include "backend/kernel_compiler/gpu/sponge/nvtit/md_iteration_setup_random_state.h" | |||||
| namespace mindspore { | |||||
| namespace kernel { | |||||
| MS_REG_GPU_KERNEL_TWO(MDIterationSetupRandState, KernelAttr().AddOutputAttr(kNumberTypeFloat32), | |||||
| MDIterationSetupRandStateGpuKernel, float, int) | |||||
| } // namespace kernel | |||||
| } // namespace mindspore | |||||
| @@ -0,0 +1,74 @@ | |||||
| /** | |||||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| */ | |||||
| #ifndef MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_MD_ITERATION_SETUP_RANDOM_STATE_GPU_KERNEL_H_ | |||||
| #define MINDSPORE_CCSRC_BACKEND_KERNEL_COMPILER_GPU_MD_ITERATION_SETUP_RANDOM_STATE_GPU_KERNEL_H_ | |||||
| #include "backend/kernel_compiler/gpu/cuda_impl/sponge/nvtit/md_iteration_setup_random_state_gpu_impl.cuh" | |||||
| #include <cuda_runtime_api.h> | |||||
| #include <map> | |||||
| #include <string> | |||||
| #include <vector> | |||||
| #include "backend/kernel_compiler/gpu/gpu_kernel.h" | |||||
| #include "backend/kernel_compiler/gpu/gpu_kernel_factory.h" | |||||
| #include "runtime/device/gpu/cuda_common.h" | |||||
| namespace mindspore { | |||||
| namespace kernel { | |||||
| template <typename T, typename T1> | |||||
| class MDIterationSetupRandStateGpuKernel : public GpuKernel { | |||||
| public: | |||||
| MDIterationSetupRandStateGpuKernel() {} | |||||
| ~MDIterationSetupRandStateGpuKernel() override = default; | |||||
| bool Init(const CNodePtr &kernel_node) override { | |||||
| // get bond_numbers | |||||
| kernel_node_ = kernel_node; | |||||
| atom_numbers = static_cast<int>(GetAttr<int64_t>(kernel_node, "atom_numbers")); | |||||
| seed = static_cast<int>(GetAttr<int64_t>(kernel_node, "seed")); | |||||
| float4_numbers = ceil(3. * static_cast<double>(atom_numbers) / 4.); | |||||
| InitSizeLists(); | |||||
| return true; | |||||
| } | |||||
| const std::vector<size_t> &GetInputSizeList() const override { return input_size_list_; } | |||||
| const std::vector<size_t> &GetOutputSizeList() const override { return output_size_list_; } | |||||
| const std::vector<size_t> &GetWorkspaceSizeList() const override { return workspace_size_list_; } | |||||
| bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &, | |||||
| const std::vector<AddressPtr> &outputs, void *stream_ptr) override { | |||||
| auto output = GetDeviceAddress<float>(outputs, 0); | |||||
| curandStatePhilox4_32_10_t *rand_state = reinterpret_cast<curandStatePhilox4_32_10_t *>(output); | |||||
| MD_Iteration_Setup_Random_State(float4_numbers, rand_state, seed, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| return true; | |||||
| } | |||||
| protected: | |||||
| void InitSizeLists() override { output_size_list_.push_back(sizeof(curandStatePhilox4_32_10_t) * float4_numbers); } | |||||
| private: | |||||
| std::vector<size_t> input_size_list_; | |||||
| std::vector<size_t> output_size_list_; | |||||
| std::vector<size_t> workspace_size_list_; | |||||
| int atom_numbers; | |||||
| int seed; | |||||
| int float4_numbers; | |||||
| }; | |||||
| } // namespace kernel | |||||
| } // namespace mindspore | |||||
| #endif | |||||
| @@ -19,7 +19,6 @@ namespace mindspore { | |||||
| namespace kernel { | namespace kernel { | ||||
| MS_REG_GPU_KERNEL_TWO(PMEEnergy, | MS_REG_GPU_KERNEL_TWO(PMEEnergy, | ||||
| KernelAttr() | KernelAttr() | ||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeUInt32) | .AddInputAttr(kNumberTypeUInt32) | ||||
| .AddInputAttr(kNumberTypeFloat32) | .AddInputAttr(kNumberTypeFloat32) | ||||
| .AddInputAttr(kNumberTypeInt32) | .AddInputAttr(kNumberTypeInt32) | ||||
| @@ -18,8 +18,6 @@ | |||||
| #include <cuda_runtime_api.h> | #include <cuda_runtime_api.h> | ||||
| #include <cufft.h> | #include <cufft.h> | ||||
| #include <vector> | #include <vector> | ||||
| #include <string> | |||||
| #include <map> | |||||
| #include "backend/kernel_compiler/gpu/gpu_kernel.h" | #include "backend/kernel_compiler/gpu/gpu_kernel.h" | ||||
| #include "backend/kernel_compiler/gpu/gpu_kernel_factory.h" | #include "backend/kernel_compiler/gpu/gpu_kernel_factory.h" | ||||
| #include "runtime/device/gpu/cuda_common.h" | #include "runtime/device/gpu/cuda_common.h" | ||||
| @@ -40,8 +38,76 @@ class PMEEnergyGpuKernel : public GpuKernel { | |||||
| fftx = static_cast<int>(GetAttr<int64_t>(kernel_node, "fftx")); | fftx = static_cast<int>(GetAttr<int64_t>(kernel_node, "fftx")); | ||||
| ffty = static_cast<int>(GetAttr<int64_t>(kernel_node, "ffty")); | ffty = static_cast<int>(GetAttr<int64_t>(kernel_node, "ffty")); | ||||
| fftz = static_cast<int>(GetAttr<int64_t>(kernel_node, "fftz")); | fftz = static_cast<int>(GetAttr<int64_t>(kernel_node, "fftz")); | ||||
| PME_Nall = fftx * ffty * fftz; | |||||
| float box_length_0 = static_cast<float>(GetAttr<float_t>(kernel_node, "box_length_0")); | |||||
| float box_length_1 = static_cast<float>(GetAttr<float_t>(kernel_node, "box_length_1")); | |||||
| float box_length_2 = static_cast<float>(GetAttr<float_t>(kernel_node, "box_length_2")); | |||||
| std::vector<float> h_box_length(3); | |||||
| h_box_length[0] = box_length_0; | |||||
| h_box_length[1] = box_length_1; | |||||
| h_box_length[2] = box_length_2; | |||||
| VECTOR *box_length = reinterpret_cast<VECTOR *>(h_box_length.data()); | |||||
| cufftPlan3d(&PME_plan_r2c, fftx, ffty, fftz, CUFFT_R2C); | |||||
| cufftPlan3d(&PME_plan_c2r, fftx, ffty, fftz, CUFFT_C2R); | |||||
| _thread_PME.x = 8; | |||||
| _thread_PME.y = 8; | |||||
| PME_Nin = ffty * fftz; | |||||
| PME_Nfft = fftx * ffty * (fftz / 2 + 1); | PME_Nfft = fftx * ffty * (fftz / 2 + 1); | ||||
| PME_Nall = fftx * ffty * fftz; | |||||
| PME_kxyz_cpu.resize(64); | |||||
| volume = box_length[0].x * box_length[0].y * box_length[0].z; | |||||
| int kx, ky, kz, kxrp, kyrp, kzrp, index; | |||||
| for (kx = 0; kx < 4; kx++) { | |||||
| for (ky = 0; ky < 4; ky++) { | |||||
| for (kz = 0; kz < 4; kz++) { | |||||
| index = kx * 16 + ky * 4 + kz; | |||||
| PME_kxyz_cpu[index].uint_x = kx; | |||||
| PME_kxyz_cpu[index].uint_y = ky; | |||||
| PME_kxyz_cpu[index].uint_z = kz; | |||||
| } | |||||
| } | |||||
| } | |||||
| B1.resize(fftx); | |||||
| B2.resize(ffty); | |||||
| B3.resize(fftz); | |||||
| PME_BC0.resize(PME_Nfft); | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| B1[kx] = getb(kx, fftx, 4); | |||||
| } | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| B2[ky] = getb(ky, ffty, 4); | |||||
| } | |||||
| for (kz = 0; kz < fftz; kz++) { | |||||
| B3[kz] = getb(kz, fftz, 4); | |||||
| } | |||||
| float mprefactor = PI * PI / -beta / beta; | |||||
| float msq; | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| kxrp = kx; | |||||
| if (kx > fftx / 2) kxrp = fftx - kx; | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| kyrp = ky; | |||||
| if (ky > ffty / 2) kyrp = ffty - ky; | |||||
| for (kz = 0; kz <= fftz / 2; kz++) { | |||||
| kzrp = kz; | |||||
| msq = kxrp * kxrp / box_length[0].x / box_length[0].x + kyrp * kyrp / box_length[0].y / box_length[0].y + | |||||
| kzrp * kzrp / box_length[0].z / box_length[0].z; | |||||
| index = kx * ffty * (fftz / 2 + 1) + ky * (fftz / 2 + 1) + kz; | |||||
| if ((kx + ky + kz) == 0) { | |||||
| PME_BC0[index] = 0; | |||||
| } else { | |||||
| PME_BC0[index] = 1.0 / PI / msq * exp(mprefactor * msq) / volume; | |||||
| } | |||||
| PME_BC0[index] *= B1[kx] * B2[ky] * B3[kz]; | |||||
| } | |||||
| } | |||||
| } | |||||
| InitSizeLists(); | InitSizeLists(); | ||||
| return true; | return true; | ||||
| @@ -53,15 +119,14 @@ class PMEEnergyGpuKernel : public GpuKernel { | |||||
| bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &workspace, | bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &workspace, | ||||
| const std::vector<AddressPtr> &outputs, void *stream_ptr) override { | const std::vector<AddressPtr> &outputs, void *stream_ptr) override { | ||||
| auto boxlength = GetDeviceAddress<T>(inputs, 0); | |||||
| auto uint_crd = GetDeviceAddress<T1>(inputs, 1); | |||||
| auto charge = GetDeviceAddress<T>(inputs, 2); | |||||
| auto nl_numbers = GetDeviceAddress<T1>(inputs, 3); | |||||
| auto nl_serial = GetDeviceAddress<T1>(inputs, 4); | |||||
| auto scaler = GetDeviceAddress<T>(inputs, 5); | |||||
| auto excluded_list_start = GetDeviceAddress<int>(inputs, 6); | |||||
| auto excluded_list = GetDeviceAddress<int>(inputs, 7); | |||||
| auto excluded_atom_numbers = GetDeviceAddress<int>(inputs, 8); | |||||
| auto uint_crd = GetDeviceAddress<T1>(inputs, 0); | |||||
| auto charge = GetDeviceAddress<T>(inputs, 1); | |||||
| auto nl_numbers = GetDeviceAddress<T1>(inputs, 2); | |||||
| auto nl_serial = GetDeviceAddress<T1>(inputs, 3); | |||||
| auto scaler = GetDeviceAddress<T>(inputs, 4); | |||||
| auto excluded_list_start = GetDeviceAddress<int>(inputs, 5); | |||||
| auto excluded_list = GetDeviceAddress<int>(inputs, 6); | |||||
| auto excluded_atom_numbers = GetDeviceAddress<int>(inputs, 7); | |||||
| auto pme_uxyz = GetDeviceAddress<int>(workspace, 0); // workspace | auto pme_uxyz = GetDeviceAddress<int>(workspace, 0); // workspace | ||||
| auto pme_frxyz = GetDeviceAddress<float>(workspace, 1); // workspace | auto pme_frxyz = GetDeviceAddress<float>(workspace, 1); // workspace | ||||
| @@ -77,16 +142,22 @@ class PMEEnergyGpuKernel : public GpuKernel { | |||||
| auto direct_ene = GetDeviceAddress<T>(outputs, 2); | auto direct_ene = GetDeviceAddress<T>(outputs, 2); | ||||
| auto correction_ene = GetDeviceAddress<T>(outputs, 3); | auto correction_ene = GetDeviceAddress<T>(outputs, 3); | ||||
| PMEEnergy(fftx, ffty, fftz, atom_numbers, beta, boxlength, pme_bc, pme_uxyz, pme_frxyz, pme_q, pme_fq, | |||||
| pme_atom_near, pme_kxyz, uint_crd, charge, nl_numbers, nl_serial, nl, scaler, excluded_list_start, | |||||
| excluded_list, excluded_atom_numbers, reciprocal_ene, self_ene, direct_ene, correction_ene, | |||||
| reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| cufftSetStream(PME_plan_r2c, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| cufftSetStream(PME_plan_c2r, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| cudaMemcpyAsync(pme_kxyz, PME_kxyz_cpu.data(), sizeof(UNSIGNED_INT_VECTOR) * 64, cudaMemcpyHostToDevice, | |||||
| reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| cudaMemcpyAsync(pme_bc, PME_BC0.data(), sizeof(float) * PME_Nfft, cudaMemcpyHostToDevice, | |||||
| reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| PMEEnergy(fftx, ffty, fftz, atom_numbers, beta, pme_bc, pme_uxyz, pme_frxyz, pme_q, pme_fq, pme_atom_near, pme_kxyz, | |||||
| uint_crd, charge, nl_numbers, nl_serial, nl, scaler, excluded_list_start, excluded_list, | |||||
| excluded_atom_numbers, reciprocal_ene, self_ene, direct_ene, correction_ene, _thread_PME, PME_Nin, | |||||
| PME_Nfft, PME_Nall, PME_plan_r2c, PME_plan_c2r, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| return true; | return true; | ||||
| } | } | ||||
| protected: | protected: | ||||
| void InitSizeLists() override { | void InitSizeLists() override { | ||||
| input_size_list_.push_back(sizeof(VECTOR)); | |||||
| input_size_list_.push_back(atom_numbers * sizeof(UNSIGNED_INT_VECTOR)); | input_size_list_.push_back(atom_numbers * sizeof(UNSIGNED_INT_VECTOR)); | ||||
| input_size_list_.push_back(atom_numbers * sizeof(VECTOR)); | input_size_list_.push_back(atom_numbers * sizeof(VECTOR)); | ||||
| input_size_list_.push_back(atom_numbers * sizeof(T1)); | input_size_list_.push_back(atom_numbers * sizeof(T1)); | ||||
| @@ -112,12 +183,56 @@ class PMEEnergyGpuKernel : public GpuKernel { | |||||
| output_size_list_.push_back(sizeof(T)); | output_size_list_.push_back(sizeof(T)); | ||||
| } | } | ||||
| cufftComplex expc(cufftComplex z) { | |||||
| cufftComplex res; | |||||
| float t = expf(z.x); | |||||
| sincosf(z.y, &res.y, &res.x); | |||||
| res.x *= t; | |||||
| res.y *= t; | |||||
| return res; | |||||
| } | |||||
| float M_(float u, int n) { | |||||
| if (n == 2) { | |||||
| if (u > 2 || u < 0) return 0; | |||||
| return 1 - abs(u - 1); | |||||
| } else { | |||||
| return u / (n - 1) * M_(u, n - 1) + (n - u) / (n - 1) * M_(u - 1, n - 1); | |||||
| } | |||||
| } | |||||
| float getb(int k, int NFFT, int B_order) { | |||||
| cufftComplex tempc, tempc2, res; | |||||
| float tempf; | |||||
| tempc2.x = 0; | |||||
| tempc2.y = 0; | |||||
| tempc.x = 0; | |||||
| tempc.y = 2 * (B_order - 1) * PI * k / NFFT; | |||||
| res = expc(tempc); | |||||
| for (int kk = 0; kk < (B_order - 1); kk++) { | |||||
| tempc.x = 0; | |||||
| tempc.y = 2 * PI * k / NFFT * kk; | |||||
| tempc = expc(tempc); | |||||
| tempf = M_(kk + 1, B_order); | |||||
| tempc2.x += tempf * tempc.x; | |||||
| tempc2.y += tempf * tempc.y; | |||||
| } | |||||
| res = cuCdivf(res, tempc2); | |||||
| return res.x * res.x + res.y * res.y; | |||||
| } | |||||
| private: | private: | ||||
| size_t ele_uint_crd = 1; | size_t ele_uint_crd = 1; | ||||
| std::vector<size_t> input_size_list_; | std::vector<size_t> input_size_list_; | ||||
| std::vector<size_t> output_size_list_; | std::vector<size_t> output_size_list_; | ||||
| std::vector<size_t> workspace_size_list_; | std::vector<size_t> workspace_size_list_; | ||||
| std::vector<float> B1; | |||||
| std::vector<float> B2; | |||||
| std::vector<float> B3; | |||||
| std::vector<float> PME_BC0; | |||||
| int atom_numbers; | int atom_numbers; | ||||
| int excluded_numbers; | int excluded_numbers; | ||||
| int max_nl_numbers = 800; | int max_nl_numbers = 800; | ||||
| @@ -125,8 +240,16 @@ class PMEEnergyGpuKernel : public GpuKernel { | |||||
| int ffty; | int ffty; | ||||
| int fftz; | int fftz; | ||||
| float beta; | float beta; | ||||
| int PME_Nin; | |||||
| int PME_Nall; | int PME_Nall; | ||||
| int PME_Nfft; | int PME_Nfft; | ||||
| float volume; | |||||
| float PI = 3.1415926; | |||||
| cufftHandle PME_plan_r2c; | |||||
| cufftHandle PME_plan_c2r; | |||||
| dim3 _thread_PME; | |||||
| struct VECTOR { | struct VECTOR { | ||||
| float x; | float x; | ||||
| float y; | float y; | ||||
| @@ -138,7 +261,7 @@ class PMEEnergyGpuKernel : public GpuKernel { | |||||
| unsigned int uint_y; | unsigned int uint_y; | ||||
| unsigned int uint_z; | unsigned int uint_z; | ||||
| }; | }; | ||||
| std::vector<UNSIGNED_INT_VECTOR> PME_kxyz_cpu; | |||||
| struct NEIGHBOR_LIST { | struct NEIGHBOR_LIST { | ||||
| int atom_numbers; | int atom_numbers; | ||||
| int *atom_serial; | int *atom_serial; | ||||
| @@ -17,13 +17,10 @@ | |||||
| namespace mindspore { | namespace mindspore { | ||||
| namespace kernel { | namespace kernel { | ||||
| MS_REG_GPU_KERNEL_TWO(PMEReciprocalForce, | |||||
| KernelAttr() | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddInputAttr(kNumberTypeUInt32) | |||||
| .AddInputAttr(kNumberTypeFloat32) | |||||
| .AddOutputAttr(kNumberTypeFloat32), | |||||
| PMEReciprocalForceGpuKernel, float, int) | |||||
| MS_REG_GPU_KERNEL_TWO( | |||||
| PMEReciprocalForce, | |||||
| KernelAttr().AddInputAttr(kNumberTypeUInt32).AddInputAttr(kNumberTypeFloat32).AddOutputAttr(kNumberTypeFloat32), | |||||
| PMEReciprocalForceGpuKernel, float, int) | |||||
| } // namespace kernel | } // namespace kernel | ||||
| } // namespace mindspore | } // namespace mindspore | ||||
| @@ -41,6 +41,75 @@ class PMEReciprocalForceGpuKernel : public GpuKernel { | |||||
| fftz = static_cast<int>(GetAttr<int64_t>(kernel_node, "fftz")); | fftz = static_cast<int>(GetAttr<int64_t>(kernel_node, "fftz")); | ||||
| PME_Nall = fftx * ffty * fftz; | PME_Nall = fftx * ffty * fftz; | ||||
| PME_Nfft = fftx * ffty * (fftz / 2 + 1); | PME_Nfft = fftx * ffty * (fftz / 2 + 1); | ||||
| PME_Nin = ffty * fftz; | |||||
| float box_length_0 = static_cast<float>(GetAttr<float_t>(kernel_node, "box_length_0")); | |||||
| float box_length_1 = static_cast<float>(GetAttr<float_t>(kernel_node, "box_length_1")); | |||||
| float box_length_2 = static_cast<float>(GetAttr<float_t>(kernel_node, "box_length_2")); | |||||
| std::vector<float> h_box_length(3); | |||||
| h_box_length[0] = box_length_0; | |||||
| h_box_length[1] = box_length_1; | |||||
| h_box_length[2] = box_length_2; | |||||
| VECTOR *box_length = reinterpret_cast<VECTOR *>(h_box_length.data()); | |||||
| PME_inverse_box_vector.x = static_cast<float>(fftx) / box_length[0].x; | |||||
| PME_inverse_box_vector.y = static_cast<float>(ffty) / box_length[0].y; | |||||
| PME_inverse_box_vector.z = static_cast<float>(fftz) / box_length[0].z; | |||||
| cufftPlan3d(&PME_plan_r2c, fftx, ffty, fftz, CUFFT_R2C); | |||||
| cufftPlan3d(&PME_plan_c2r, fftx, ffty, fftz, CUFFT_C2R); | |||||
| float volume = box_length[0].x * box_length[0].y * box_length[0].z; | |||||
| PME_kxyz_cpu.resize(64); | |||||
| int kx, ky, kz, kxrp, kyrp, kzrp, index; | |||||
| for (kx = 0; kx < 4; kx++) { | |||||
| for (ky = 0; ky < 4; ky++) { | |||||
| for (kz = 0; kz < 4; kz++) { | |||||
| index = kx * 16 + ky * 4 + kz; | |||||
| PME_kxyz_cpu[index].uint_x = kx; | |||||
| PME_kxyz_cpu[index].uint_y = ky; | |||||
| PME_kxyz_cpu[index].uint_z = kz; | |||||
| } | |||||
| } | |||||
| } | |||||
| B1.resize(fftx); | |||||
| B2.resize(ffty); | |||||
| B3.resize(fftz); | |||||
| PME_BC0.resize(PME_Nfft); | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| B1[kx] = getb(kx, fftx, 4); | |||||
| } | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| B2[ky] = getb(ky, ffty, 4); | |||||
| } | |||||
| for (kz = 0; kz < fftz; kz++) { | |||||
| B3[kz] = getb(kz, fftz, 4); | |||||
| } | |||||
| float mprefactor = PI * PI / -beta / beta; | |||||
| float msq; | |||||
| for (kx = 0; kx < fftx; kx++) { | |||||
| kxrp = kx; | |||||
| if (kx > fftx / 2) kxrp = fftx - kx; | |||||
| for (ky = 0; ky < ffty; ky++) { | |||||
| kyrp = ky; | |||||
| if (ky > ffty / 2) kyrp = ffty - ky; | |||||
| for (kz = 0; kz <= fftz / 2; kz++) { | |||||
| kzrp = kz; | |||||
| msq = kxrp * kxrp / box_length[0].x / box_length[0].x + kyrp * kyrp / box_length[0].y / box_length[0].y + | |||||
| kzrp * kzrp / box_length[0].z / box_length[0].z; | |||||
| index = kx * ffty * (fftz / 2 + 1) + ky * (fftz / 2 + 1) + kz; | |||||
| if ((kx + ky + kz) == 0) { | |||||
| PME_BC0[index] = 0; | |||||
| } else { | |||||
| PME_BC0[index] = 1.0 / PI / msq * exp(mprefactor * msq) / volume; | |||||
| } | |||||
| PME_BC0[index] *= B1[kx] * B2[ky] * B3[kz]; | |||||
| } | |||||
| } | |||||
| } | |||||
| InitSizeLists(); | InitSizeLists(); | ||||
| return true; | return true; | ||||
| @@ -52,9 +121,8 @@ class PMEReciprocalForceGpuKernel : public GpuKernel { | |||||
| bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &workspace, | bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &workspace, | ||||
| const std::vector<AddressPtr> &outputs, void *stream_ptr) override { | const std::vector<AddressPtr> &outputs, void *stream_ptr) override { | ||||
| auto boxlength = GetDeviceAddress<T>(inputs, 0); | |||||
| auto uint_crd = GetDeviceAddress<const T1>(inputs, 1); | |||||
| auto charge = GetDeviceAddress<T>(inputs, 2); | |||||
| auto uint_crd = GetDeviceAddress<const T1>(inputs, 0); | |||||
| auto charge = GetDeviceAddress<T>(inputs, 1); | |||||
| auto pme_uxyz = GetDeviceAddress<int>(workspace, 0); // workspace | auto pme_uxyz = GetDeviceAddress<int>(workspace, 0); // workspace | ||||
| auto pme_frxyz = GetDeviceAddress<float>(workspace, 1); // workspace | auto pme_frxyz = GetDeviceAddress<float>(workspace, 1); // workspace | ||||
| @@ -65,9 +133,15 @@ class PMEReciprocalForceGpuKernel : public GpuKernel { | |||||
| auto pme_kxyz = GetDeviceAddress<int>(workspace, 6); // workspace | auto pme_kxyz = GetDeviceAddress<int>(workspace, 6); // workspace | ||||
| auto force = GetDeviceAddress<T>(outputs, 0); | auto force = GetDeviceAddress<T>(outputs, 0); | ||||
| cufftSetStream(PME_plan_r2c, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| cufftSetStream(PME_plan_c2r, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| cudaMemcpyAsync(pme_kxyz, PME_kxyz_cpu.data(), sizeof(UNSIGNED_INT_VECTOR) * 64, cudaMemcpyHostToDevice, | |||||
| reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| cudaMemcpyAsync(pme_bc, PME_BC0.data(), sizeof(float) * PME_Nfft, cudaMemcpyHostToDevice, | |||||
| reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| PMEReciprocalForce(fftx, ffty, fftz, atom_numbers, beta, pme_bc, pme_uxyz, pme_frxyz, pme_q, pme_fq, pme_atom_near, | PMEReciprocalForce(fftx, ffty, fftz, atom_numbers, beta, pme_bc, pme_uxyz, pme_frxyz, pme_q, pme_fq, pme_atom_near, | ||||
| pme_kxyz, boxlength, uint_crd, charge, force, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| pme_kxyz, uint_crd, charge, force, PME_Nin, PME_Nall, PME_Nfft, PME_plan_r2c, PME_plan_c2r, | |||||
| PME_inverse_box_vector, reinterpret_cast<cudaStream_t>(stream_ptr)); | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -88,6 +162,44 @@ class PMEReciprocalForceGpuKernel : public GpuKernel { | |||||
| output_size_list_.push_back(atom_numbers * sizeof(VECTOR)); | output_size_list_.push_back(atom_numbers * sizeof(VECTOR)); | ||||
| } | } | ||||
| cufftComplex expc(cufftComplex z) { | |||||
| cufftComplex res; | |||||
| float t = expf(z.x); | |||||
| sincosf(z.y, &res.y, &res.x); | |||||
| res.x *= t; | |||||
| res.y *= t; | |||||
| return res; | |||||
| } | |||||
| float M_(float u, int n) { | |||||
| if (n == 2) { | |||||
| if (u > 2 || u < 0) return 0; | |||||
| return 1 - abs(u - 1); | |||||
| } else { | |||||
| return u / (n - 1) * M_(u, n - 1) + (n - u) / (n - 1) * M_(u - 1, n - 1); | |||||
| } | |||||
| } | |||||
| float getb(int k, int NFFT, int B_order) { | |||||
| cufftComplex tempc, tempc2, res; | |||||
| float tempf; | |||||
| tempc2.x = 0; | |||||
| tempc2.y = 0; | |||||
| tempc.x = 0; | |||||
| tempc.y = 2 * (B_order - 1) * PI * k / NFFT; | |||||
| res = expc(tempc); | |||||
| for (int kk = 0; kk < (B_order - 1); kk++) { | |||||
| tempc.x = 0; | |||||
| tempc.y = 2 * PI * k / NFFT * kk; | |||||
| tempc = expc(tempc); | |||||
| tempf = M_(kk + 1, B_order); | |||||
| tempc2.x += tempf * tempc.x; | |||||
| tempc2.y += tempf * tempc.y; | |||||
| } | |||||
| res = cuCdivf(res, tempc2); | |||||
| return res.x * res.x + res.y * res.y; | |||||
| } | |||||
| private: | private: | ||||
| size_t ele_uint_crd = 1; | size_t ele_uint_crd = 1; | ||||
| @@ -101,18 +213,27 @@ class PMEReciprocalForceGpuKernel : public GpuKernel { | |||||
| float beta; | float beta; | ||||
| int PME_Nall; | int PME_Nall; | ||||
| int PME_Nfft; | int PME_Nfft; | ||||
| int PME_Nin; | |||||
| float PI = 3.1415926; | |||||
| std::vector<float> B1; | |||||
| std::vector<float> B2; | |||||
| std::vector<float> B3; | |||||
| std::vector<float> PME_BC0; | |||||
| cufftHandle PME_plan_r2c; | |||||
| cufftHandle PME_plan_c2r; | |||||
| struct VECTOR { | struct VECTOR { | ||||
| float x; | float x; | ||||
| float y; | float y; | ||||
| float z; | float z; | ||||
| }; | }; | ||||
| _VECTOR PME_inverse_box_vector; | |||||
| struct UNSIGNED_INT_VECTOR { | struct UNSIGNED_INT_VECTOR { | ||||
| unsigned int uint_x; | unsigned int uint_x; | ||||
| unsigned int uint_y; | unsigned int uint_y; | ||||
| unsigned int uint_z; | unsigned int uint_z; | ||||
| }; | }; | ||||
| std::vector<UNSIGNED_INT_VECTOR> PME_kxyz_cpu; | |||||
| }; | }; | ||||
| } // namespace kernel | } // namespace kernel | ||||
| } // namespace mindspore | } // namespace mindspore | ||||
| @@ -105,7 +105,8 @@ from .sponge_ops import (BondForce, BondEnergy, BondAtomEnergy, BondForceWithAto | |||||
| LJForce, LJEnergy, LJForceWithPMEDirectForce, PMEExcludedForce, PMEEnergy, Dihedral14LJForce, | LJForce, LJEnergy, LJForceWithPMEDirectForce, PMEExcludedForce, PMEEnergy, Dihedral14LJForce, | ||||
| Dihedral14LJForceWithDirectCF, Dihedral14LJEnergy, Dihedral14LJCFForceWithAtomEnergy, | Dihedral14LJForceWithDirectCF, Dihedral14LJEnergy, Dihedral14LJCFForceWithAtomEnergy, | ||||
| Dihedral14LJAtomEnergy, Dihedral14CFEnergy, Dihedral14CFAtomEnergy, MDIterationLeapFrog, | Dihedral14LJAtomEnergy, Dihedral14CFEnergy, Dihedral14CFAtomEnergy, MDIterationLeapFrog, | ||||
| GetCenterOfGeometry, MDTemperature, NeighborListUpdate) | |||||
| GetCenterOfGeometry, MDTemperature, NeighborListUpdate, MDIterationLeapFrogLiujian, | |||||
| CrdToUintCrd, MDIterationSetupRandState) | |||||
| __all__ = [ | __all__ = [ | ||||
| @@ -465,7 +466,9 @@ __all__ = [ | |||||
| "GetCenterOfGeometry", | "GetCenterOfGeometry", | ||||
| "MDTemperature", | "MDTemperature", | ||||
| "NeighborListUpdate", | "NeighborListUpdate", | ||||
| "MDIterationLeapFrogLiujian", | |||||
| "CrdToUintCrd", | |||||
| "MDIterationSetupRandState", | |||||
| ] | ] | ||||
| __all__.sort() | __all__.sort() | ||||
| @@ -12,44 +12,78 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """main""" | |||||
| import time | |||||
| '''main''' | |||||
| import argparse | import argparse | ||||
| from mindspore import context | |||||
| from src.simulation_initial import Simulation | |||||
| import time | |||||
| from src.simulation import Simulation | |||||
| import mindspore.context as context | |||||
| from mindspore import Tensor | |||||
| parser = argparse.ArgumentParser(description='Sponge Controller') | parser = argparse.ArgumentParser(description='Sponge Controller') | ||||
| parser.add_argument('--i', type=str, default=None, help='input file') | parser.add_argument('--i', type=str, default=None, help='input file') | ||||
| parser.add_argument('--amber_parm', type=str, default=None, | |||||
| help='paramter file in AMBER type') | |||||
| parser.add_argument('--c', type=str, default=None, | |||||
| help='initial coordinates file') | |||||
| parser.add_argument('--amber_parm', type=str, default=None, help='paramter file in AMBER type') | |||||
| parser.add_argument('--c', type=str, default=None, help='initial coordinates file') | |||||
| parser.add_argument('--r', type=str, default="restrt", help='') | parser.add_argument('--r', type=str, default="restrt", help='') | ||||
| parser.add_argument('--x', type=str, default="mdcrd", help='') | parser.add_argument('--x', type=str, default="mdcrd", help='') | ||||
| parser.add_argument('--o', type=str, default="mdout", help="") | parser.add_argument('--o', type=str, default="mdout", help="") | ||||
| parser.add_argument('--box', type=str, default="mdbox", help='') | parser.add_argument('--box', type=str, default="mdbox", help='') | ||||
| parser.add_argument('--device_id', type=int, default=0, help='') | |||||
| args_opt = parser.parse_args() | args_opt = parser.parse_args() | ||||
| context.set_context(mode=context.PYNATIVE_MODE, | |||||
| device_target="GPU", device_id=0, save_graphs=True) | |||||
| context.set_context(mode=context.GRAPH_MODE, device_target="GPU", device_id=args_opt.device_id, save_graphs=False) | |||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| start = time.time() | |||||
| simulation = Simulation(args_opt) | simulation = Simulation(args_opt) | ||||
| simulation.Main_Initial() | |||||
| res = simulation.Initial_Neighbor_List_Update(not_first_time=0) | |||||
| md_info = simulation.md_info | |||||
| md_info.step_limit = 1 | |||||
| for i in range(1, md_info.step_limit + 1): | |||||
| print("steps: ", i) | |||||
| md_info.steps = i | |||||
| simulation.Main_Before_Calculate_Force() | |||||
| simulation.Main_Calculate_Force() | |||||
| simulation.Main_Calculate_Energy() | |||||
| simulation.Main_After_Calculate_Energy() | |||||
| temperature = simulation.Main_Print() | |||||
| simulation.Main_Iteration_2() | |||||
| start = time.time() | |||||
| compiler_time = 0 | |||||
| save_path = args_opt.o | |||||
| file = open(save_path, 'w') | |||||
| for steps in range(simulation.md_info.step_limit): | |||||
| print_step = steps % simulation.ntwx | |||||
| if steps == simulation.md_info.step_limit - 1: | |||||
| print_step = 0 | |||||
| temperature, total_potential_energy, sigma_of_bond_ene, sigma_of_angle_ene, sigma_of_dihedral_ene, \ | |||||
| nb14_lj_energy_sum, nb14_cf_energy_sum, LJ_energy_sum, ee_ene, _ = simulation(Tensor(steps), Tensor(print_step)) | |||||
| if steps == 0: | |||||
| compiler_time = time.time() | |||||
| if steps % simulation.ntwx == 0 or steps == simulation.md_info.step_limit - 1: | |||||
| if steps == 0: | |||||
| print("_steps_ _TEMP_ _TOT_POT_ENE_ _BOND_ENE_ " | |||||
| "_ANGLE_ENE_ _DIHEDRAL_ENE_ _14LJ_ENE_ _14CF_ENE_ _LJ_ENE_ _CF_PME_ENE_") | |||||
| file.write("_steps_ _TEMP_ _TOT_POT_ENE_ _BOND_ENE_ " | |||||
| "_ANGLE_ENE_ _DIHEDRAL_ENE_ _14LJ_ENE_ _14CF_ENE_ _LJ_ENE_ _CF_PME_ENE_\n") | |||||
| temperature = temperature.asnumpy() | |||||
| total_potential_energy = total_potential_energy.asnumpy() | |||||
| print("{:>7.0f} {:>7.3f} {:>11.3f}".format(steps, float(temperature), float(total_potential_energy)), | |||||
| end=" ") | |||||
| if simulation.bond.bond_numbers > 0: | |||||
| sigma_of_bond_ene = sigma_of_bond_ene.asnumpy() | |||||
| print("{:>10.3f}".format(float(sigma_of_bond_ene)), end=" ") | |||||
| if simulation.angle.angle_numbers > 0: | |||||
| sigma_of_angle_ene = sigma_of_angle_ene.asnumpy() | |||||
| print("{:>11.3f}".format(float(sigma_of_angle_ene)), end=" ") | |||||
| if simulation.dihedral.dihedral_numbers > 0: | |||||
| sigma_of_dihedral_ene = sigma_of_dihedral_ene.asnumpy() | |||||
| print("{:>14.3f}".format(float(sigma_of_dihedral_ene)), end=" ") | |||||
| if simulation.nb14.nb14_numbers > 0: | |||||
| nb14_lj_energy_sum = nb14_lj_energy_sum.asnumpy() | |||||
| nb14_cf_energy_sum = nb14_cf_energy_sum.asnumpy() | |||||
| print("{:>10.3f} {:>10.3f}".format(float(nb14_lj_energy_sum), float(nb14_cf_energy_sum)), end=" ") | |||||
| LJ_energy_sum = LJ_energy_sum.asnumpy() | |||||
| ee_ene = ee_ene.asnumpy() | |||||
| print("{:>7.3f}".format(float(LJ_energy_sum)), end=" ") | |||||
| print("{:>12.3f}".format(float(ee_ene))) | |||||
| if file is not None: | |||||
| file.write("{:>7.0f} {:>7.3f} {:>11.3f} {:>10.3f} {:>11.3f} {:>14.3f} {:>10.3f} {:>10.3f} {:>7.3f}" | |||||
| " {:>12.3f}\n".format(steps, float(temperature), float(total_potential_energy), | |||||
| float(sigma_of_bond_ene), float(sigma_of_angle_ene), | |||||
| float(sigma_of_dihedral_ene), float(nb14_lj_energy_sum), | |||||
| float(nb14_cf_energy_sum), float(LJ_energy_sum), float(ee_ene))) | |||||
| end = time.time() | end = time.time() | ||||
| file.close() | |||||
| print("Main time(s):", end - start) | print("Main time(s):", end - start) | ||||
| simulation.Main_Destroy() | |||||
| print("Main time(s) without compiler:", end - compiler_time) | |||||
| @@ -12,31 +12,19 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """angle class""" | |||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class Angle(nn.Cell): | |||||
| """Angle class""" | |||||
| '''Angle''' | |||||
| class Angle: | |||||
| '''Angle''' | |||||
| def __init__(self, controller): | def __init__(self, controller): | ||||
| super(Angle, self).__init__() | |||||
| if controller.amber_parm is not None: | if controller.amber_parm is not None: | ||||
| file_path = controller.amber_parm | file_path = controller.amber_parm | ||||
| self.read_information_from_amberfile(file_path) | self.read_information_from_amberfile(file_path) | ||||
| self.atom_a = Tensor(np.asarray(self.h_atom_a, np.int32), mstype.int32) | |||||
| self.atom_b = Tensor(np.asarray(self.h_atom_b, np.int32), mstype.int32) | |||||
| self.atom_c = Tensor(np.asarray(self.h_atom_c, np.int32), mstype.int32) | |||||
| self.angle_k = Tensor(np.asarray(self.h_angle_k, np.float32), mstype.float32) | |||||
| self.angle_theta0 = Tensor(np.asarray(self.h_angle_theta0, np.float32), mstype.float32) | |||||
| def read_process1(self, context): | |||||
| """read_information_from_amberfile process1""" | |||||
| def read_information_from_amberfile(self, file_path): | |||||
| '''read amber file''' | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if idx < len(context) - 1: | if idx < len(context) - 1: | ||||
| if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | ||||
| @@ -46,6 +34,7 @@ class Angle(nn.Cell): | |||||
| self.angle_with_H_numbers = value[4] | self.angle_with_H_numbers = value[4] | ||||
| self.angle_without_H_numbers = value[5] | self.angle_without_H_numbers = value[5] | ||||
| self.angle_numbers = self.angle_with_H_numbers + self.angle_without_H_numbers | self.angle_numbers = self.angle_with_H_numbers + self.angle_without_H_numbers | ||||
| # print(self.angle_numbers) | |||||
| information = [] | information = [] | ||||
| information.extend(value) | information.extend(value) | ||||
| while count < 15: | while count < 15: | ||||
| @@ -57,8 +46,10 @@ class Angle(nn.Cell): | |||||
| print("angle type numbers ", self.angle_type_numbers) | print("angle type numbers ", self.angle_type_numbers) | ||||
| break | break | ||||
| def read_process2(self, context): | |||||
| """read_information_from_amberfile process2""" | |||||
| self.h_atom_a = [0] * self.angle_numbers | |||||
| self.h_atom_b = [0] * self.angle_numbers | |||||
| self.h_atom_c = [0] * self.angle_numbers | |||||
| self.h_type = [0] * self.angle_numbers | |||||
| angle_count = 0 | angle_count = 0 | ||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG ANGLES_INC_HYDROGEN" in val: | if "%FLAG ANGLES_INC_HYDROGEN" in val: | ||||
| @@ -81,20 +72,6 @@ class Angle(nn.Cell): | |||||
| angle_count += 1 | angle_count += 1 | ||||
| break | break | ||||
| return angle_count | |||||
| def read_information_from_amberfile(self, file_path): | |||||
| """read information from amberfile""" | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.read_process1(context) | |||||
| self.h_atom_a = [0] * self.angle_numbers | |||||
| self.h_atom_b = [0] * self.angle_numbers | |||||
| self.h_atom_c = [0] * self.angle_numbers | |||||
| self.h_type = [0] * self.angle_numbers | |||||
| angle_count = self.read_process2(context) | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG ANGLES_WITHOUT_HYDROGEN" in val: | if "%FLAG ANGLES_WITHOUT_HYDROGEN" in val: | ||||
| @@ -109,14 +86,17 @@ class Angle(nn.Cell): | |||||
| value = list(map(int, context[start_idx].strip().split())) | value = list(map(int, context[start_idx].strip().split())) | ||||
| information.extend(value) | information.extend(value) | ||||
| count += len(value) | count += len(value) | ||||
| for i in range(self.angle_without_H_numbers): | |||||
| for _ in range(self.angle_without_H_numbers): | |||||
| self.h_atom_a[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 0] / 3 | self.h_atom_a[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 0] / 3 | ||||
| self.h_atom_b[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 1] / 3 | self.h_atom_b[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 1] / 3 | ||||
| self.h_atom_c[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 2] / 3 | self.h_atom_c[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 2] / 3 | ||||
| self.h_type[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 3] - 1 | self.h_type[angle_count] = information[(angle_count - self.angle_with_H_numbers) * 4 + 3] - 1 | ||||
| angle_count += 1 | angle_count += 1 | ||||
| break | break | ||||
| self.processor(context, angle_count) | |||||
| def processor(self, context, angle_count): | |||||
| ''' processor ''' | |||||
| self.type_k = [0] * self.angle_type_numbers | self.type_k = [0] * self.angle_type_numbers | ||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG ANGLE_FORCE_CONSTANT" in val: | if "%FLAG ANGLE_FORCE_CONSTANT" in val: | ||||
| @@ -159,17 +139,3 @@ class Angle(nn.Cell): | |||||
| for i in range(self.angle_numbers): | for i in range(self.angle_numbers): | ||||
| self.h_angle_k.append(self.type_k[self.h_type[i]]) | self.h_angle_k.append(self.type_k[self.h_type[i]]) | ||||
| self.h_angle_theta0.append(self.type_theta0[self.h_type[i]]) | self.h_angle_theta0.append(self.type_theta0[self.h_type[i]]) | ||||
| def Angle_Energy(self, uint_crd, uint_dr_to_dr_cof): | |||||
| """compute angle energy""" | |||||
| self.angle_energy = P.AngleEnergy(self.angle_numbers)(uint_crd, uint_dr_to_dr_cof, self.atom_a, self.atom_b, | |||||
| self.atom_c, self.angle_k, self.angle_theta0) | |||||
| self.sigma_of_angle_ene = P.ReduceSum()(self.angle_energy) | |||||
| return self.sigma_of_angle_ene | |||||
| def Angle_Force_With_Atom_Energy(self, uint_crd, scaler): | |||||
| """compute angle force with atom energy""" | |||||
| print("angele angle numbers:", self.angle_numbers) | |||||
| self.afae = P.AngleForceWithAtomEnergy(angle_numbers=self.angle_numbers) | |||||
| frc, ene = self.afae(uint_crd, scaler, self.atom_a, self.atom_b, self.atom_c, self.angle_k, self.angle_theta0) | |||||
| return frc, ene | |||||
| @@ -12,19 +12,10 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """bond class""" | |||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class Bond(nn.Cell): | |||||
| """bond class""" | |||||
| '''Bond''' | |||||
| class Bond: | |||||
| '''Bond''' | |||||
| def __init__(self, controller, md_info): | def __init__(self, controller, md_info): | ||||
| super(Bond, self).__init__() | |||||
| self.atom_numbers = md_info.atom_numbers | self.atom_numbers = md_info.atom_numbers | ||||
| @@ -32,13 +23,11 @@ class Bond(nn.Cell): | |||||
| file_path = controller.amber_parm | file_path = controller.amber_parm | ||||
| self.read_information_from_amberfile(file_path) | self.read_information_from_amberfile(file_path) | ||||
| self.atom_a = Tensor(np.asarray(self.h_atom_a, np.int32), mstype.int32) | |||||
| self.atom_b = Tensor(np.asarray(self.h_atom_b, np.int32), mstype.int32) | |||||
| self.bond_k = Tensor(np.asarray(self.h_k, np.float32), mstype.float32) | |||||
| self.bond_r0 = Tensor(np.asarray(self.h_r0, np.float32), mstype.float32) | |||||
| def process1(self, context): | |||||
| """process1: read information from amberfile""" | |||||
| def read_information_from_amberfile(self, file_path): | |||||
| '''read amber file''' | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if idx < len(context) - 1: | if idx < len(context) - 1: | ||||
| if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | ||||
| @@ -48,7 +37,6 @@ class Bond(nn.Cell): | |||||
| self.bond_with_hydrogen = value[2] | self.bond_with_hydrogen = value[2] | ||||
| self.bond_numbers = value[3] | self.bond_numbers = value[3] | ||||
| self.bond_numbers += self.bond_with_hydrogen | self.bond_numbers += self.bond_with_hydrogen | ||||
| print(self.bond_numbers) | |||||
| information = [] | information = [] | ||||
| information.extend(value) | information.extend(value) | ||||
| while count < 16: | while count < 16: | ||||
| @@ -76,13 +64,6 @@ class Bond(nn.Cell): | |||||
| self.bond_type_k = information[:self.bond_type_numbers] | self.bond_type_k = information[:self.bond_type_numbers] | ||||
| break | break | ||||
| def read_information_from_amberfile(self, file_path): | |||||
| """read information from amberfile""" | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.process1(context) | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG BOND_EQUIL_VALUE" in val: | if "%FLAG BOND_EQUIL_VALUE" in val: | ||||
| count = 0 | count = 0 | ||||
| @@ -98,7 +79,10 @@ class Bond(nn.Cell): | |||||
| count += len(value) | count += len(value) | ||||
| self.bond_type_r = information[:self.bond_type_numbers] | self.bond_type_r = information[:self.bond_type_numbers] | ||||
| break | break | ||||
| self.processor(context) | |||||
| def processor(self, context): | |||||
| '''processor''' | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG BONDS_INC_HYDROGEN" in val: | if "%FLAG BONDS_INC_HYDROGEN" in val: | ||||
| self.h_atom_a = [0] * self.bond_numbers | self.h_atom_a = [0] * self.bond_numbers | ||||
| @@ -128,6 +112,7 @@ class Bond(nn.Cell): | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG BONDS_WITHOUT_HYDROGEN" in val: | if "%FLAG BONDS_WITHOUT_HYDROGEN" in val: | ||||
| count = 0 | count = 0 | ||||
| start_idx = idx | start_idx = idx | ||||
| information = [] | information = [] | ||||
| @@ -147,17 +132,3 @@ class Bond(nn.Cell): | |||||
| self.h_k[i] = self.bond_type_k[tmpi] | self.h_k[i] = self.bond_type_k[tmpi] | ||||
| self.h_r0[i] = self.bond_type_r[tmpi] | self.h_r0[i] = self.bond_type_r[tmpi] | ||||
| break | break | ||||
| def Bond_Energy(self, uint_crd, uint_dr_to_dr_cof): | |||||
| """compute bond energy""" | |||||
| self.bond_energy = P.BondEnergy(self.bond_numbers, self.atom_numbers)(uint_crd, uint_dr_to_dr_cof, self.atom_a, | |||||
| self.atom_b, self.bond_k, self.bond_r0) | |||||
| self.sigma_of_bond_ene = P.ReduceSum()(self.bond_energy) | |||||
| return self.sigma_of_bond_ene | |||||
| def Bond_Force_With_Atom_Energy(self, uint_crd, scaler): | |||||
| """compute bond force with atom energy""" | |||||
| self.bfatomenergy = P.BondForceWithAtomEnergy(bond_numbers=self.bond_numbers, | |||||
| atom_numbers=self.atom_numbers) | |||||
| frc, atom_energy = self.bfatomenergy(uint_crd, scaler, self.atom_a, self.atom_b, self.bond_k, self.bond_r0) | |||||
| return frc, atom_energy | |||||
| @@ -12,38 +12,23 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """dihedral class""" | |||||
| '''Dihedral''' | |||||
| import math | import math | ||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class Dihedral(nn.Cell): | |||||
| """dihedral class""" | |||||
| class Dihedral: | |||||
| '''Dihedral''' | |||||
| def __init__(self, controller): | def __init__(self, controller): | ||||
| super(Dihedral, self).__init__() | |||||
| self.CONSTANT_Pi = 3.1415926535897932 | self.CONSTANT_Pi = 3.1415926535897932 | ||||
| if controller.amber_parm is not None: | if controller.amber_parm is not None: | ||||
| file_path = controller.amber_parm | file_path = controller.amber_parm | ||||
| self.read_information_from_amberfile(file_path) | self.read_information_from_amberfile(file_path) | ||||
| self.atom_a = Tensor(np.asarray(self.h_atom_a, np.int32), mstype.int32) | |||||
| self.atom_b = Tensor(np.asarray(self.h_atom_b, np.int32), mstype.int32) | |||||
| self.atom_c = Tensor(np.asarray(self.h_atom_c, np.int32), mstype.int32) | |||||
| self.atom_d = Tensor(np.asarray(self.h_atom_d, np.int32), mstype.int32) | |||||
| self.pk = Tensor(np.asarray(self.pk, np.float32), mstype.float32) | |||||
| self.gamc = Tensor(np.asarray(self.gamc, np.float32), mstype.float32) | |||||
| self.gams = Tensor(np.asarray(self.gams, np.float32), mstype.float32) | |||||
| self.pn = Tensor(np.asarray(self.pn, np.float32), mstype.float32) | |||||
| self.ipn = Tensor(np.asarray(self.ipn, np.int32), mstype.int32) | |||||
| def process1(self, context): | |||||
| """process1: read information from amberfile""" | |||||
| def read_information_from_amberfile(self, file_path): | |||||
| '''read amber file''' | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if idx < len(context) - 1: | if idx < len(context) - 1: | ||||
| if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | ||||
| @@ -115,15 +100,10 @@ class Dihedral(nn.Cell): | |||||
| count += len(value) | count += len(value) | ||||
| self.pn_type = information[:self.dihedral_type_numbers] | self.pn_type = information[:self.dihedral_type_numbers] | ||||
| break | break | ||||
| self.processor(context) | |||||
| def read_information_from_amberfile(self, file_path): | |||||
| """read information from amberfile""" | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.process1(context) | |||||
| def processor(self, context): | |||||
| '''processor''' | |||||
| self.h_atom_a = [0] * self.dihedral_numbers | self.h_atom_a = [0] * self.dihedral_numbers | ||||
| self.h_atom_b = [0] * self.dihedral_numbers | self.h_atom_b = [0] * self.dihedral_numbers | ||||
| self.h_atom_c = [0] * self.dihedral_numbers | self.h_atom_c = [0] * self.dihedral_numbers | ||||
| @@ -204,18 +184,3 @@ class Dihedral(nn.Cell): | |||||
| for i in range(self.dihedral_numbers): | for i in range(self.dihedral_numbers): | ||||
| if self.h_atom_c[i] < 0: | if self.h_atom_c[i] < 0: | ||||
| self.h_atom_c[i] *= -1 | self.h_atom_c[i] *= -1 | ||||
| def Dihedral_Engergy(self, uint_crd, uint_dr_to_dr_cof): | |||||
| """compute dihedral energy""" | |||||
| self.dihedral_energy = P.DihedralEnergy(self.dihedral_numbers)(uint_crd, uint_dr_to_dr_cof, self.atom_a, | |||||
| self.atom_b, self.atom_c, self.atom_d, self.ipn, | |||||
| self.pk, self.gamc, self.gams, self.pn) | |||||
| self.sigma_of_dihedral_ene = P.ReduceSum()(self.dihedral_energy) | |||||
| return self.sigma_of_dihedral_ene | |||||
| def Dihedral_Force_With_Atom_Energy(self, uint_crd, scaler): | |||||
| """compute dihedral force and atom energy""" | |||||
| self.dfae = P.DihedralForceWithAtomEnergy(dihedral_numbers=self.dihedral_numbers) | |||||
| self.frc, self.ene = self.dfae(uint_crd, scaler, self.atom_a, self.atom_b, self.atom_c, self.atom_d, | |||||
| self.ipn, self.pk, self.gamc, self.gams, self.pn) | |||||
| return self.frc, self.ene | |||||
| @@ -12,18 +12,14 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """Langevin Liujian MD class""" | |||||
| '''LagevinLiuJian''' | |||||
| import math | import math | ||||
| import numpy as np | import numpy as np | ||||
| from mindspore.common.tensor import Tensor | |||||
| import mindspore.common.dtype as mstype | |||||
| class Langevin_Liujian: | class Langevin_Liujian: | ||||
| """Langevin_Liujian class""" | |||||
| '''LagevinLiuJian''' | |||||
| def __init__(self, controller, atom_numbers): | def __init__(self, controller, atom_numbers): | ||||
| self.atom_numbers = atom_numbers | self.atom_numbers = atom_numbers | ||||
| if controller.amber_parm is not None: | if controller.amber_parm is not None: | ||||
| @@ -37,29 +33,27 @@ class Langevin_Liujian: | |||||
| controller.Command_Set["target_temperature"]) | controller.Command_Set["target_temperature"]) | ||||
| self.gamma_ln = 1.0 if "langevin_gamma" not in controller.Command_Set else float( | self.gamma_ln = 1.0 if "langevin_gamma" not in controller.Command_Set else float( | ||||
| controller.Command_Set["langevin_gamma"]) | controller.Command_Set["langevin_gamma"]) | ||||
| self.rand_seed = 0 if "langevin_seed" not in controller.Command_Set else float( | |||||
| controller.Command_Set["langevin_seed"]) # jiahong0315 | |||||
| self.rand_seed = 1 if "langevin_seed" not in controller.Command_Set else float( | |||||
| controller.Command_Set["langevin_seed"]) | |||||
| self.max_velocity = 10000.0 if "velocity_max" not in controller.Command_Set else float( | self.max_velocity = 10000.0 if "velocity_max" not in controller.Command_Set else float( | ||||
| controller.Command_Set["velocity_max"]) | controller.Command_Set["velocity_max"]) | ||||
| assert self.max_velocity > 0 | assert self.max_velocity > 0 | ||||
| self.is_max_velocity = 0 if "velocity_max" not in controller.Command_Set else 1 | |||||
| print("target temperature is ", self.target_temperature) | print("target temperature is ", self.target_temperature) | ||||
| print("friction coefficient is ", self.gamma_ln, "ps^-1") | print("friction coefficient is ", self.gamma_ln, "ps^-1") | ||||
| print("random seed is ", self.rand_seed) | print("random seed is ", self.rand_seed) | ||||
| self.dt = float(controller.Command_Set["dt"]) | self.dt = float(controller.Command_Set["dt"]) | ||||
| self.dt *= self.CONSTANT_TIME_CONVERTION | self.dt *= self.CONSTANT_TIME_CONVERTION | ||||
| self.half_dt = 0.5 * self.dt | self.half_dt = 0.5 * self.dt | ||||
| self.float4_numbers = math.ceil(3.0 * self.atom_numbers / 4.0) | |||||
| self.rand_state = np.float32(np.zeros([math.ceil(3 * self.atom_numbers / 4.0) * 16,])) | |||||
| self.gamma_ln = self.gamma_ln / self.CONSTANT_TIME_CONVERTION | self.gamma_ln = self.gamma_ln / self.CONSTANT_TIME_CONVERTION | ||||
| self.exp_gamma = math.exp(-1 * self.gamma_ln * self.dt) | self.exp_gamma = math.exp(-1 * self.gamma_ln * self.dt) | ||||
| self.sqrt_gamma = math.sqrt((1. - self.exp_gamma * self.exp_gamma) * self.target_temperature * self.CONSTANT_kB) | self.sqrt_gamma = math.sqrt((1. - self.exp_gamma * self.exp_gamma) * self.target_temperature * self.CONSTANT_kB) | ||||
| self.h_sqrt_mass = [0] * self.atom_numbers | self.h_sqrt_mass = [0] * self.atom_numbers | ||||
| for i in range(self.atom_numbers): | for i in range(self.atom_numbers): | ||||
| self.h_sqrt_mass[i] = self.sqrt_gamma * math.sqrt(1. / self.h_mass[i]) | self.h_sqrt_mass[i] = self.sqrt_gamma * math.sqrt(1. / self.h_mass[i]) | ||||
| self.d_sqrt_mass = Tensor(self.h_sqrt_mass, mstype.float32) | |||||
| def read_information_from_amberfile(self, file_path): | def read_information_from_amberfile(self, file_path): | ||||
| """read information from amberfile""" | |||||
| '''read amber file''' | |||||
| file = open(file_path, 'r') | file = open(file_path, 'r') | ||||
| context = file.readlines() | context = file.readlines() | ||||
| file.close() | file.close() | ||||
| @@ -81,29 +75,3 @@ class Langevin_Liujian: | |||||
| for i in range(self.atom_numbers): | for i in range(self.atom_numbers): | ||||
| self.h_mass[i] = information[i] | self.h_mass[i] = information[i] | ||||
| break | break | ||||
| def MDIterationLeapFrog_Liujian(self, atom_numbers, half_dt, dt, exp_gamma, inverse_mass, sqrt_mass_inverse, vel, | |||||
| crd, frc, random_frc): | |||||
| """compute MDIterationLeapFrog Liujian""" | |||||
| inverse_mass = inverse_mass.reshape((-1, 1)) | |||||
| sqrt_mass_inverse = sqrt_mass_inverse.reshape((-1, 1)) | |||||
| acc = inverse_mass * frc | |||||
| vel = vel + dt * acc | |||||
| crd = crd + half_dt * vel | |||||
| vel = exp_gamma * vel + sqrt_mass_inverse * random_frc | |||||
| crd = crd + half_dt * vel | |||||
| frc = Tensor(np.zeros((atom_numbers, 3)), mstype.float32) | |||||
| return vel, crd, frc, acc | |||||
| def MD_Iteration_Leap_Frog(self, d_mass_inverse, vel_in, crd_in, frc_in): | |||||
| """MD_Iteration_Leap_Frog""" | |||||
| np.random.seed(int(self.rand_seed)) | |||||
| self.rand_force = Tensor(np.zeros((self.atom_numbers, 3)), mstype.float32) | |||||
| # self.rand_force = Tensor(np.random.randn(self.atom_numbers, 3), mstype.float32) | |||||
| vel, crd, frc, acc = self.MDIterationLeapFrog_Liujian(atom_numbers=self.atom_numbers, half_dt=self.half_dt, | |||||
| dt=self.dt, exp_gamma=self.exp_gamma, | |||||
| inverse_mass=d_mass_inverse, | |||||
| sqrt_mass_inverse=self.d_sqrt_mass, | |||||
| vel=vel_in, crd=crd_in, | |||||
| frc=frc_in, random_frc=self.rand_force) | |||||
| return vel, crd, frc, acc | |||||
| @@ -12,30 +12,16 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """lennard jones""" | |||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class Lennard_Jones_Information(nn.Cell): | |||||
| """class Lennard Jones Information""" | |||||
| '''Lennard Jones''' | |||||
| class Lennard_Jones_Information: | |||||
| '''Lennard Jones''' | |||||
| def __init__(self, controller): | def __init__(self, controller): | ||||
| super(Lennard_Jones_Information, self).__init__() | |||||
| if controller.amber_parm is not None: | if controller.amber_parm is not None: | ||||
| file_path = controller.amber_parm | file_path = controller.amber_parm | ||||
| self.read_information_from_amberfile(file_path) | self.read_information_from_amberfile(file_path) | ||||
| self.atom_LJ_type = Tensor(np.asarray(self.atom_LJ_type, dtype=np.int32), mstype.int32) | |||||
| self.LJ_A = Tensor(np.asarray(self.LJ_A, dtype=np.float32), mstype.float32) | |||||
| self.LJ_B = Tensor(np.asarray(self.LJ_B, dtype=np.float32), mstype.float32) | |||||
| self.LJ_energy_sum = 0 | |||||
| self.LJ_energy = 0 | |||||
| def read_information_from_amberfile(self, file_path): | def read_information_from_amberfile(self, file_path): | ||||
| """read information from amberfile""" | |||||
| '''read amber file''' | |||||
| file = open(file_path, 'r') | file = open(file_path, 'r') | ||||
| context = file.readlines() | context = file.readlines() | ||||
| file.close() | file.close() | ||||
| @@ -48,8 +34,8 @@ class Lennard_Jones_Information(nn.Cell): | |||||
| value = list(map(int, context[start_idx].strip().split())) | value = list(map(int, context[start_idx].strip().split())) | ||||
| self.atom_numbers = value[0] | self.atom_numbers = value[0] | ||||
| self.atom_type_numbers = value[1] | self.atom_type_numbers = value[1] | ||||
| self.pair_type_numbers = int(self.atom_type_numbers * (self.atom_type_numbers + 1) / 2) | |||||
| print(self.pair_type_numbers) | |||||
| self.pair_type_numbers = int( | |||||
| self.atom_type_numbers * (self.atom_type_numbers + 1) / 2) # TODO 这个地方有问题啊 | |||||
| break | break | ||||
| self.atom_LJ_type = [0] * self.atom_numbers | self.atom_LJ_type = [0] * self.atom_numbers | ||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| @@ -102,21 +88,3 @@ class Lennard_Jones_Information(nn.Cell): | |||||
| for i in range(self.pair_type_numbers): | for i in range(self.pair_type_numbers): | ||||
| self.LJ_B[i] = 6.0 * information[i] | self.LJ_B[i] = 6.0 * information[i] | ||||
| break | break | ||||
| def LJ_Energy(self, uint_crd_with_LJ, uint_dr_to_dr_cof, nl_atom_numbers, nl_atom_serial, cutoff_square): | |||||
| """compute LJ energy""" | |||||
| uint_crd, LJtype, charge = uint_crd_with_LJ | |||||
| self.LJ_energy = P.LJEnergy(self.atom_numbers, cutoff_square) \ | |||||
| (uint_crd, LJtype, charge, uint_dr_to_dr_cof, nl_atom_numbers, nl_atom_serial, self.LJ_A, self.LJ_B) | |||||
| self.LJ_energy_sum = P.ReduceSum()(self.LJ_energy) | |||||
| return self.LJ_energy_sum | |||||
| def LJ_Force_With_PME_Direct_Force(self, atom_numbers, uint_crd_with_LJ, uint_dr_to_dr_cof, nl_number, nl_serial, | |||||
| cutoff, beta): | |||||
| """compute LJ force with PME direct force""" | |||||
| assert atom_numbers == self.atom_numbers | |||||
| assert isinstance(uint_crd_with_LJ, tuple) | |||||
| uint_crd_f, LJtype, charge = uint_crd_with_LJ | |||||
| self.ljfd = P.LJForceWithPMEDirectForce(atom_numbers, cutoff, beta) | |||||
| frc = self.ljfd(uint_crd_f, LJtype, charge, uint_dr_to_dr_cof, nl_number, nl_serial, self.LJ_A, self.LJ_B) | |||||
| return frc | |||||
| @@ -12,36 +12,29 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """md information""" | |||||
| '''MD Information''' | |||||
| import numpy as np | import numpy as np | ||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class md_information(nn.Cell): | |||||
| """class md information""" | |||||
| class md_information: | |||||
| '''MD Information''' | |||||
| def __init__(self, controller): | def __init__(self, controller): | ||||
| super(md_information, self).__init__() | |||||
| CONSTANT_TIME_CONVERTION = 20.455 | CONSTANT_TIME_CONVERTION = 20.455 | ||||
| CONSTANT_UINT_MAX_FLOAT = 4294967296.0 | CONSTANT_UINT_MAX_FLOAT = 4294967296.0 | ||||
| self.md_task = controller.md_task | self.md_task = controller.md_task | ||||
| self.mode = 0 if "mode" not in controller.Command_Set else int(controller.Command_Set["mode"]) | self.mode = 0 if "mode" not in controller.Command_Set else int(controller.Command_Set["mode"]) | ||||
| self.dt = 0.001 * CONSTANT_TIME_CONVERTION if "dt" not in controller.Command_Set \ | |||||
| else float(controller.Command_Set["dt"]) * CONSTANT_TIME_CONVERTION | |||||
| self.skin = 2.0 if "skin" not in controller.Command_Set \ | |||||
| else float(controller.Command_Set["skin"]) | |||||
| self.dt = 0.001 * CONSTANT_TIME_CONVERTION if "dt" not in controller.Command_Set else float( | |||||
| controller.Command_Set["dt"]) * CONSTANT_TIME_CONVERTION | |||||
| self.skin = 2.0 if "skin" not in controller.Command_Set else float(controller.Command_Set["skin"]) | |||||
| self.trans_vec = [self.skin, self.skin, self.skin] | self.trans_vec = [self.skin, self.skin, self.skin] | ||||
| self.trans_vec_minus = -1 * self.trans_vec | self.trans_vec_minus = -1 * self.trans_vec | ||||
| self.step_limit = 1000 if "step_limit" not in controller.Command_Set else int( | self.step_limit = 1000 if "step_limit" not in controller.Command_Set else int( | ||||
| controller.Command_Set["step_limit"]) | controller.Command_Set["step_limit"]) | ||||
| self.netfrc = 0 if "net_force" not in controller.Command_Set else int(controller.Command_Set["net_force"]) | self.netfrc = 0 if "net_force" not in controller.Command_Set else int(controller.Command_Set["net_force"]) | ||||
| self.ntwx = 1000 if "write_information_interval" not in controller.Command_Set else \ | |||||
| int(controller.Command_Set["write_information_interval"]) | |||||
| self.ntce = self.step_limit + 1 if "calculate_energy_interval" not in controller.Command_Set else \ | |||||
| int(controller.Command_Set["calculate_energy_interval"]) | |||||
| self.ntwx = 1000 if "write_information_interval" not in controller.Command_Set else int( | |||||
| controller.Command_Set["write_information_interval"]) | |||||
| self.ntce = self.step_limit + 1 if "calculate_energy_interval" not in controller.Command_Set else int( | |||||
| controller.Command_Set["calculate_energy_interval"]) | |||||
| self.atom_numbers = 0 | self.atom_numbers = 0 | ||||
| self.residue_numbers = 0 | self.residue_numbers = 0 | ||||
| self.density = 0.0 | self.density = 0.0 | ||||
| @@ -51,7 +44,6 @@ class md_information(nn.Cell): | |||||
| self.h_mass = [] | self.h_mass = [] | ||||
| self.h_mass_inverse = [] | self.h_mass_inverse = [] | ||||
| self.h_charge = [] | self.h_charge = [] | ||||
| self.steps = 0 | |||||
| if controller.amber_parm is not None: | if controller.amber_parm is not None: | ||||
| self.read_basic_system_information_from_amber_file(controller.amber_parm) | self.read_basic_system_information_from_amber_file(controller.amber_parm) | ||||
| @@ -67,23 +59,13 @@ class md_information(nn.Cell): | |||||
| self.uint_dr_to_dr_cof = [1.0 / self.crd_to_uint_crd_cof[0], 1.0 / self.crd_to_uint_crd_cof[1], | self.uint_dr_to_dr_cof = [1.0 / self.crd_to_uint_crd_cof[0], 1.0 / self.crd_to_uint_crd_cof[1], | ||||
| 1.0 / self.crd_to_uint_crd_cof[2]] | 1.0 / self.crd_to_uint_crd_cof[2]] | ||||
| self.density *= 1e24 / 6.023e23 / (self.box_length[0] * self.box_length[1] * self.box_length[2]) | self.density *= 1e24 / 6.023e23 / (self.box_length[0] * self.box_length[1] * self.box_length[2]) | ||||
| self.frc = Tensor(np.zeros((self.atom_numbers, 3)), mstype.float32) | |||||
| self.crd = Tensor(np.array(self.coordinate, dtype=np.float32).reshape((self.atom_numbers, 3)), mstype.float32) | |||||
| self.crd_n = np.array(self.coordinate).reshape([self.atom_numbers, 3]) | |||||
| self.crd_old = Tensor(np.zeros([self.atom_numbers, 3], dtype=np.float32), mstype.float32) | |||||
| self.uint_crd = Tensor(np.zeros([self.atom_numbers, 3], dtype=np.uint32), mstype.uint32) | |||||
| self.charge = Tensor(self.h_charge, mstype.float32) | |||||
| self.crd_to_uint_crd_cof_n = np.array(self.crd_to_uint_crd_cof) | |||||
| self.crd_to_uint_crd_cof = Tensor(self.crd_to_uint_crd_cof, mstype.float32) | |||||
| self.uint_dr_to_dr_cof = Tensor(self.uint_dr_to_dr_cof, mstype.float32) | |||||
| self.uint_crd_with_LJ = None | |||||
| self.d_mass_inverse = Tensor(self.h_mass_inverse, mstype.float32) | |||||
| self.d_res_start = Tensor(self.h_res_start, mstype.int32) | |||||
| self.d_res_end = Tensor(self.h_res_end, mstype.int32) | |||||
| self.d_mass = Tensor(self.h_mass, mstype.float32) | |||||
| def process1(self, context): | |||||
| """process1: read basic system information from amber file""" | |||||
| self.velocity = np.reshape(np.asarray(self.velocity, np.float32), [self.atom_numbers, 3]) | |||||
| def read_basic_system_information_from_amber_file(self, path): | |||||
| '''read amber file''' | |||||
| file = open(path, 'r') | |||||
| context = file.readlines() | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if idx < len(context) - 1: | if idx < len(context) - 1: | ||||
| if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | if "%FLAG POINTERS" in val + context[idx + 1] and "%FORMAT(10I8)" in val + context[idx + 1]: | ||||
| @@ -95,16 +77,10 @@ class md_information(nn.Cell): | |||||
| start_idx += 1 | start_idx += 1 | ||||
| value = list(map(int, context[start_idx].strip().split())) | value = list(map(int, context[start_idx].strip().split())) | ||||
| count += len(value) | count += len(value) | ||||
| self.residue_numbers = list(map(int, context[start_idx].strip().split()))[10 - (count - 10)] | |||||
| self.residue_numbers = list(map(int, context[start_idx].strip().split()))[ | |||||
| 10 - (count - 10)] # may exist bug | |||||
| break | break | ||||
| def read_basic_system_information_from_amber_file(self, path): | |||||
| """read basic system information from amber file""" | |||||
| file = open(path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.process1(context) | |||||
| if self.residue_numbers != 0 and self.atom_numbers != 0: | if self.residue_numbers != 0 and self.atom_numbers != 0: | ||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG RESIDUE_POINTER" in val: | if "%FLAG RESIDUE_POINTER" in val: | ||||
| @@ -124,42 +100,45 @@ class md_information(nn.Cell): | |||||
| self.h_res_start.append(self.lin_serial[-1] - 1) | self.h_res_start.append(self.lin_serial[-1] - 1) | ||||
| self.h_res_end.append(self.atom_numbers + 1 - 1) | self.h_res_end.append(self.atom_numbers + 1 - 1) | ||||
| break | break | ||||
| self.processor(context) | |||||
| for idx, val in enumerate(context): | |||||
| if "%FLAG MASS" in val: | |||||
| count = 0 | |||||
| start_idx = idx | |||||
| while count != self.atom_numbers: | |||||
| start_idx += 1 | |||||
| if "%FORMAT" in context[start_idx]: | |||||
| continue | |||||
| else: | |||||
| value = list(map(float, context[start_idx].strip().split())) | |||||
| self.h_mass.extend(value) | |||||
| count += len(value) | |||||
| for i in range(self.atom_numbers): | |||||
| if self.h_mass[i] == 0: | |||||
| self.h_mass_inverse.append(0.0) | |||||
| else: | |||||
| self.h_mass_inverse.append(1.0 / self.h_mass[i]) | |||||
| self.density += self.h_mass[i] | |||||
| break | |||||
| for idx, val in enumerate(context): | |||||
| if "%FLAG CHARGE" in val: | |||||
| count = 0 | |||||
| start_idx = idx | |||||
| while count != self.atom_numbers: | |||||
| start_idx += 1 | |||||
| if "%FORMAT" in context[start_idx]: | |||||
| continue | |||||
| else: | |||||
| value = list(map(float, context[start_idx].strip().split())) | |||||
| self.h_charge.extend(value) | |||||
| count += len(value) | |||||
| break | |||||
| def processor(self, context): | |||||
| '''processor''' | |||||
| for idx, val in enumerate(context): | |||||
| if "%FLAG MASS" in val: | |||||
| count = 0 | |||||
| start_idx = idx | |||||
| while count != self.atom_numbers: | |||||
| start_idx += 1 | |||||
| if "%FORMAT" in context[start_idx]: | |||||
| continue | |||||
| else: | |||||
| value = list(map(float, context[start_idx].strip().split())) | |||||
| self.h_mass.extend(value) | |||||
| count += len(value) | |||||
| for i in range(self.atom_numbers): | |||||
| if self.h_mass[i] == 0: | |||||
| self.h_mass_inverse.append(0.0) | |||||
| else: | |||||
| self.h_mass_inverse.append(1.0 / self.h_mass[i]) | |||||
| self.density += self.h_mass[i] | |||||
| break | |||||
| for idx, val in enumerate(context): | |||||
| if "%FLAG CHARGE" in val: | |||||
| count = 0 | |||||
| start_idx = idx | |||||
| while count != self.atom_numbers: | |||||
| start_idx += 1 | |||||
| if "%FORMAT" in context[start_idx]: | |||||
| continue | |||||
| else: | |||||
| value = list(map(float, context[start_idx].strip().split())) | |||||
| self.h_charge.extend(value) | |||||
| count += len(value) | |||||
| break | |||||
| def read_basic_system_information_from_rst7(self, path, irest): | def read_basic_system_information_from_rst7(self, path, irest): | ||||
| """read basic system information from rst7""" | |||||
| '''read rst7 file''' | |||||
| file = open(path, 'r') | file = open(path, 'r') | ||||
| context = file.readlines() | context = file.readlines() | ||||
| file.close() | file.close() | ||||
| @@ -191,22 +170,4 @@ class md_information(nn.Cell): | |||||
| self.coordinate = information[: 3 * self.atom_numbers] | self.coordinate = information[: 3 * self.atom_numbers] | ||||
| self.velocity = [0.0] * (3 * self.atom_numbers) | self.velocity = [0.0] * (3 * self.atom_numbers) | ||||
| self.box_length = information[3 * self.atom_numbers:3 * self.atom_numbers + 3] | self.box_length = information[3 * self.atom_numbers:3 * self.atom_numbers + 3] | ||||
| self.vel = Tensor(self.velocity, mstype.float32).reshape((self.atom_numbers, 3)) | |||||
| self.acc = Tensor(np.zeros((self.atom_numbers, 3), dtype=np.float32), mstype.float32) | |||||
| def MD_Information_Crd_To_Uint_Crd(self): | |||||
| """transform the crd to uint crd""" | |||||
| uint_crd = self.crd.asnumpy() * (0.5 * self.crd_to_uint_crd_cof.asnumpy()) * 2 | |||||
| self.uint_crd = Tensor(uint_crd, mstype.uint32) | |||||
| return self.uint_crd | |||||
| def Centerize(self): | |||||
| return | |||||
| def MD_Information_Temperature(self): | |||||
| """compute temperature""" | |||||
| self.mdtemp = P.MDTemperature(self.residue_numbers, self.atom_numbers) | |||||
| self.res_ek_energy = self.mdtemp(self.d_res_start, self.d_res_end, self.vel, self.d_mass) | |||||
| self.d_temperature = P.ReduceSum()(self.res_ek_energy) | |||||
| return self.d_temperature | |||||
| print("system size is ", self.box_length[0], self.box_length[1], self.box_length[2]) | |||||
| @@ -12,20 +12,10 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """nb14""" | |||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class NON_BOND_14(nn.Cell): | |||||
| """class Non bond 14""" | |||||
| '''NON BOND''' | |||||
| class NON_BOND_14: | |||||
| '''NON BOND''' | |||||
| def __init__(self, controller, dihedral, atom_numbers): | def __init__(self, controller, dihedral, atom_numbers): | ||||
| super(NON_BOND_14, self).__init__() | |||||
| self.dihedral_with_hydrogen = dihedral.dihedral_with_hydrogen | self.dihedral_with_hydrogen = dihedral.dihedral_with_hydrogen | ||||
| self.dihedral_numbers = dihedral.dihedral_numbers | self.dihedral_numbers = dihedral.dihedral_numbers | ||||
| self.dihedral_type_numbers = dihedral.dihedral_type_numbers | self.dihedral_type_numbers = dihedral.dihedral_type_numbers | ||||
| @@ -34,14 +24,20 @@ class NON_BOND_14(nn.Cell): | |||||
| if controller.amber_parm is not None: | if controller.amber_parm is not None: | ||||
| file_path = controller.amber_parm | file_path = controller.amber_parm | ||||
| self.read_information_from_amberfile(file_path) | self.read_information_from_amberfile(file_path) | ||||
| self.h_atom_a = self.h_atom_a[:self.nb14_numbers] | |||||
| self.h_atom_b = self.h_atom_b[:self.nb14_numbers] | |||||
| self.h_lj_scale_factor = self.h_lj_scale_factor[:self.nb14_numbers] | |||||
| self.h_cf_scale_factor = self.h_cf_scale_factor[:self.nb14_numbers] | |||||
| self.atom_a = Tensor(np.asarray(self.h_atom_a, np.int32), mstype.int32) | |||||
| self.atom_b = Tensor(np.asarray(self.h_atom_b, np.int32), mstype.int32) | |||||
| self.lj_scale_factor = Tensor(np.asarray(self.h_lj_scale_factor, np.float32), mstype.float32) | |||||
| self.cf_scale_factor = Tensor(np.asarray(self.h_cf_scale_factor, np.float32), mstype.float32) | |||||
| def read_information_from_amberfile(self, file_path): | |||||
| '''read amber file''' | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.cf_scale_type = [0] * self.dihedral_type_numbers | |||||
| self.lj_scale_type = [0] * self.dihedral_type_numbers | |||||
| def process1(self, context): | |||||
| """process1: read information from amberfile""" | |||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG SCEE_SCALE_FACTOR" in val: | if "%FLAG SCEE_SCALE_FACTOR" in val: | ||||
| count = 0 | count = 0 | ||||
| @@ -73,16 +69,10 @@ class NON_BOND_14(nn.Cell): | |||||
| count += len(value) | count += len(value) | ||||
| self.lj_scale_type = information[:self.dihedral_type_numbers] | self.lj_scale_type = information[:self.dihedral_type_numbers] | ||||
| break | break | ||||
| self.processor(context) | |||||
| def read_information_from_amberfile(self, file_path): | |||||
| """read information from amberfile""" | |||||
| file = open(file_path, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.cf_scale_type = [0] * self.dihedral_type_numbers | |||||
| self.lj_scale_type = [0] * self.dihedral_type_numbers | |||||
| self.process1(context) | |||||
| def processor(self, context): | |||||
| '''processor''' | |||||
| self.h_atom_a = [0] * self.dihedral_numbers | self.h_atom_a = [0] * self.dihedral_numbers | ||||
| self.h_atom_b = [0] * self.dihedral_numbers | self.h_atom_b = [0] * self.dihedral_numbers | ||||
| self.h_lj_scale_factor = [0] * self.dihedral_numbers | self.h_lj_scale_factor = [0] * self.dihedral_numbers | ||||
| @@ -154,42 +144,3 @@ class NON_BOND_14(nn.Cell): | |||||
| break | break | ||||
| self.nb14_numbers = nb14_numbers | self.nb14_numbers = nb14_numbers | ||||
| def Non_Bond_14_LJ_Energy(self, uint_crd_with_LJ, uint_dr_to_dr_cof, LJ_A, LJ_B): | |||||
| """compute Non bond 14 LJ energy""" | |||||
| assert isinstance(uint_crd_with_LJ, tuple) | |||||
| uint_crd, LJtype, charge = uint_crd_with_LJ | |||||
| self.LJ_energy = P.Dihedral14LJEnergy(self.nb14_numbers, self.atom_numbers)(uint_crd, LJtype, charge, | |||||
| uint_dr_to_dr_cof, self.atom_a, | |||||
| self.atom_b, self.lj_scale_factor, | |||||
| LJ_A, LJ_B) | |||||
| self.nb14_lj_energy_sum = P.ReduceSum()(self.LJ_energy) | |||||
| return self.nb14_lj_energy_sum | |||||
| def Non_Bond_14_CF_Energy(self, uint_crd_with_LJ, uint_dr_to_dr_cof): | |||||
| """compute Non bond 14 CF energy""" | |||||
| assert isinstance(uint_crd_with_LJ, tuple) | |||||
| uint_crd, LJtype, charge = uint_crd_with_LJ | |||||
| self.CF_energy = P.Dihedral14CFEnergy(self.nb14_numbers, self.atom_numbers)(uint_crd, LJtype, charge, | |||||
| uint_dr_to_dr_cof, self.atom_a, | |||||
| self.atom_b, self.cf_scale_factor) | |||||
| self.nb14_cf_energy_sum = P.ReduceSum()(self.CF_energy) | |||||
| return self.nb14_cf_energy_sum | |||||
| def Non_Bond_14_LJ_CF_Energy(self, uint_crd_with_LJ, uint_dr_to_dr_cof, LJ_A, LJ_B): | |||||
| """compute Non bond 14 LJ and CF energy""" | |||||
| assert isinstance(uint_crd_with_LJ, tuple) | |||||
| self.nb14_lj_energy_sum = self.Non_Bond_14_LJ_Energy(uint_crd_with_LJ, uint_dr_to_dr_cof, LJ_A, LJ_B) | |||||
| self.nb14_cf_energy_sum = self.Non_Bond_14_CF_Energy(uint_crd_with_LJ, uint_dr_to_dr_cof) | |||||
| return self.nb14_lj_energy_sum, self.nb14_cf_energy_sum | |||||
| def Non_Bond_14_LJ_CF_Force_With_Atom_Energy(self, uint_crd_with_LJ, boxlength, LJ_A, LJ_B): | |||||
| """compute Non bond 14 LJ CF force and atom energy""" | |||||
| self.d14lj = P.Dihedral14LJCFForceWithAtomEnergy(nb14_numbers=self.nb14_numbers, atom_numbers=self.atom_numbers) | |||||
| assert isinstance(uint_crd_with_LJ, tuple) | |||||
| uint_crd_f, LJtype, charge = uint_crd_with_LJ | |||||
| self.frc, self.atom_ene = self.d14lj(uint_crd_f, LJtype, charge, boxlength, self.atom_a, self.atom_b, | |||||
| self.lj_scale_factor, self.cf_scale_factor, LJ_A, LJ_B) | |||||
| return self.frc, self.atom_ene | |||||
| @@ -12,25 +12,16 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """neighbour list""" | |||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class nb_infomation(nn.Cell): | |||||
| """neighbour list""" | |||||
| '''Neighbor List''' | |||||
| class neighbor_list: | |||||
| '''Neighbor List''' | |||||
| def __init__(self, controller, atom_numbers, box_length): | def __init__(self, controller, atom_numbers, box_length): | ||||
| super(nb_infomation, self).__init__() | |||||
| self.refresh_interval = 20 if "neighbor_list_refresh_interval" not in controller.Command_Set else \ | |||||
| int(controller.Command_Set["neighbor_list_refresh_interval"]) | |||||
| self.max_atom_in_grid_numbers = 64 if "max_atom_in_grid_numbers" not in controller.Command_Set else \ | |||||
| int(controller.Command_Set["max_atom_in_grid_numbers"]) | |||||
| self.max_neighbor_numbers = 800 if "max_neighbor_numbers" not in controller.Command_Set else \ | |||||
| int(controller.Command_Set["max_neighbor_numbers"]) | |||||
| self.refresh_interval = 20 if "neighbor_list_refresh_interval" not in controller.Command_Set else int( | |||||
| controller.Command_Set["neighbor_list_refresh_interval"]) | |||||
| self.max_atom_in_grid_numbers = 64 if "max_atom_in_grid_numbers" not in controller.Command_Set else int( | |||||
| controller.Command_Set["max_atom_in_grid_numbers"]) | |||||
| self.max_neighbor_numbers = 800 if "max_neighbor_numbers" not in controller.Command_Set else int( | |||||
| controller.Command_Set["max_neighbor_numbers"]) | |||||
| self.skin = 2.0 if "skin" not in controller.Command_Set else float(controller.Command_Set["skin"]) | self.skin = 2.0 if "skin" not in controller.Command_Set else float(controller.Command_Set["skin"]) | ||||
| self.cutoff = 10.0 if "cut" not in controller.Command_Set else float(controller.Command_Set["cut"]) | self.cutoff = 10.0 if "cut" not in controller.Command_Set else float(controller.Command_Set["cut"]) | ||||
| self.cutoff_square = self.cutoff * self.cutoff | self.cutoff_square = self.cutoff * self.cutoff | ||||
| @@ -47,24 +38,10 @@ class nb_infomation(nn.Cell): | |||||
| self.Initial_Neighbor_Grid() | self.Initial_Neighbor_Grid() | ||||
| self.not_first_time = 0 | self.not_first_time = 0 | ||||
| self.refresh_count = 0 | |||||
| self.atom_numbers_in_grid_bucket = Tensor(np.asarray(self.atom_numbers_in_grid_bucket, np.int32), mstype.int32) | |||||
| self.bucket = Tensor( | |||||
| np.asarray(self.bucket, np.int32).reshape([self.grid_numbers, self.max_atom_in_grid_numbers]), mstype.int32) | |||||
| self.grid_N = Tensor(np.asarray(self.grid_N, np.int32), mstype.int32) | |||||
| self.grid_length_inverse = Tensor(np.asarray(self.grid_length_inverse, np.float32), mstype.float32) | |||||
| self.atom_in_grid_serial = Tensor(np.zeros(self.atom_numbers, np.int32), mstype.int32) | |||||
| self.pointer = Tensor(np.asarray(self.pointer, np.int32).reshape([self.grid_numbers, 125]), mstype.int32) | |||||
| self.nl_atom_numbers = Tensor(np.zeros(self.atom_numbers, np.int32), mstype.int32) | |||||
| self.nl_atom_serial = Tensor(np.zeros([self.atom_numbers, self.max_neighbor_numbers], np.int32), mstype.int32) | |||||
| self.excluded_list_start = Tensor(np.asarray(self.excluded_list_start, np.int32), mstype.int32) | |||||
| self.excluded_list = Tensor(np.asarray(self.excluded_list, np.int32), mstype.int32) | |||||
| self.excluded_numbers = Tensor(np.asarray(self.excluded_numbers, np.int32), mstype.int32) | |||||
| self.need_refresh_flag = Tensor(np.asarray([0], np.int32), mstype.int32) | |||||
| self.refresh_count = [0] | |||||
| def read_information_from_amberfile(self, file_path): | def read_information_from_amberfile(self, file_path): | ||||
| """read information from amberfile""" | |||||
| '''read amber file''' | |||||
| file = open(file_path, 'r') | file = open(file_path, 'r') | ||||
| context = file.readlines() | context = file.readlines() | ||||
| file.close() | file.close() | ||||
| @@ -85,6 +62,7 @@ class nb_infomation(nn.Cell): | |||||
| information.extend(value) | information.extend(value) | ||||
| count += len(value) | count += len(value) | ||||
| self.excluded_atom_numbers = information[10] | self.excluded_atom_numbers = information[10] | ||||
| print("excluded atom numbers ", self.excluded_atom_numbers) | |||||
| break | break | ||||
| for idx, val in enumerate(context): | for idx, val in enumerate(context): | ||||
| if "%FLAG NUMBER_EXCLUDED_ATOMS" in val: | if "%FLAG NUMBER_EXCLUDED_ATOMS" in val: | ||||
| @@ -125,37 +103,22 @@ class nb_infomation(nn.Cell): | |||||
| count = 0 | count = 0 | ||||
| for i in range(self.atom_numbers): | for i in range(self.atom_numbers): | ||||
| tmp_list = [] | tmp_list = [] | ||||
| for _ in range(self.excluded_numbers[i]): | |||||
| if self.excluded_numbers[i] == 1: | |||||
| tmp_list.append(information[count] - 1) | tmp_list.append(information[count] - 1) | ||||
| if information[count] == 0: | |||||
| self.excluded_numbers[i] = 0 | |||||
| count += 1 | count += 1 | ||||
| tmp_list = sorted(tmp_list) | |||||
| else: | |||||
| for _ in range(self.excluded_numbers[i]): | |||||
| tmp_list.append(information[count] - 1) | |||||
| count += 1 | |||||
| tmp_list = sorted(tmp_list) | |||||
| self.excluded_list.extend(tmp_list) | self.excluded_list.extend(tmp_list) | ||||
| break | break | ||||
| def fun(self, Nx, Ny, Nz, l, m, temp_grid_serial, count): | |||||
| """fun to replace the for""" | |||||
| for n in range(-2, 3): | |||||
| xx = Nx + l | |||||
| if xx < 0: | |||||
| xx = xx + self.Nx | |||||
| elif xx >= self.Nx: | |||||
| xx = xx - self.Nx | |||||
| yy = Ny + m | |||||
| if yy < 0: | |||||
| yy = yy + self.Ny | |||||
| elif yy >= self.Ny: | |||||
| yy = yy - self.Ny | |||||
| zz = Nz + n | |||||
| if zz < 0: | |||||
| zz = zz + self.Nz | |||||
| elif zz >= self.Nz: | |||||
| zz = zz - self.Nz | |||||
| temp_grid_serial[count] = zz * self.Nxy + yy * self.Nx + xx | |||||
| count += 1 | |||||
| return temp_grid_serial, count | |||||
| def Initial_Neighbor_Grid(self): | def Initial_Neighbor_Grid(self): | ||||
| """initial neighbour grid""" | |||||
| '''init neighbor grid''' | |||||
| half_cutoff = self.half_cutoff_with_skin | half_cutoff = self.half_cutoff_with_skin | ||||
| self.Nx = int(self.box_length[0] / half_cutoff) | self.Nx = int(self.box_length[0] / half_cutoff) | ||||
| self.Ny = int(self.box_length[1] / half_cutoff) | self.Ny = int(self.box_length[1] / half_cutoff) | ||||
| @@ -177,31 +140,23 @@ class nb_infomation(nn.Cell): | |||||
| count = 0 | count = 0 | ||||
| for l in range(-2, 3): | for l in range(-2, 3): | ||||
| for m in range(-2, 3): | for m in range(-2, 3): | ||||
| temp_grid_serial, count = self.fun(Nx, Ny, Nz, l, m, temp_grid_serial, count) | |||||
| for n in range(-2, 3): | |||||
| xx = Nx + l | |||||
| if xx < 0: | |||||
| xx = xx + self.Nx | |||||
| elif xx >= self.Nx: | |||||
| xx = xx - self.Nx | |||||
| yy = Ny + m | |||||
| if yy < 0: | |||||
| yy = yy + self.Ny | |||||
| elif yy >= self.Ny: | |||||
| yy = yy - self.Ny | |||||
| zz = Nz + n | |||||
| if zz < 0: | |||||
| zz = zz + self.Nz | |||||
| elif zz >= self.Nz: | |||||
| zz = zz - self.Nz | |||||
| temp_grid_serial[count] = zz * self.Nxy + yy * self.Nx + xx | |||||
| count += 1 | |||||
| temp_grid_serial = sorted(temp_grid_serial) | temp_grid_serial = sorted(temp_grid_serial) | ||||
| self.pointer.extend(temp_grid_serial) | self.pointer.extend(temp_grid_serial) | ||||
| def NeighborListUpdate(self, crd, old_crd, uint_crd, crd_to_uint_crd_cof, uint_dr_to_dr_cof, box_length, | |||||
| not_first_time=0): | |||||
| """NeighborList Update""" | |||||
| self.not_first_time = not_first_time | |||||
| self.neighbor_list_update = P.NeighborListUpdate(grid_numbers=self.grid_numbers, atom_numbers=self.atom_numbers, | |||||
| refresh_count=self.refresh_count, | |||||
| not_first_time=self.not_first_time, | |||||
| Nxy=self.Nxy, excluded_atom_numbers=self.excluded_atom_numbers, | |||||
| cutoff_square=self.cutoff_square, | |||||
| half_skin_square=self.half_skin_square, | |||||
| cutoff_with_skin=self.cutoff_with_skin, | |||||
| half_cutoff_with_skin=self.half_cutoff_with_skin, | |||||
| cutoff_with_skin_square=self.cutoff_with_skin_square, | |||||
| refresh_interval=self.refresh_interval, cutoff=self.cutoff, | |||||
| skin=self.skin, | |||||
| max_atom_in_grid_numbers=self.max_atom_in_grid_numbers, | |||||
| max_neighbor_numbers=self.max_neighbor_numbers) | |||||
| res = self.neighbor_list_update(self.atom_numbers_in_grid_bucket, self.bucket, crd, box_length, self.grid_N, | |||||
| self.grid_length_inverse, self.atom_in_grid_serial, old_crd, | |||||
| crd_to_uint_crd_cof, uint_crd, self.pointer, self.nl_atom_numbers, | |||||
| self.nl_atom_serial, uint_dr_to_dr_cof, self.excluded_list_start, | |||||
| self.excluded_list, self.excluded_numbers, self.need_refresh_flag) | |||||
| return res | |||||
| @@ -12,20 +12,13 @@ | |||||
| # See the License for the specific language governing permissions and | # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | # limitations under the License. | ||||
| # ============================================================================ | # ============================================================================ | ||||
| """PME""" | |||||
| '''PME''' | |||||
| import math | import math | ||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from mindspore.ops import operations as P | |||||
| class Particle_Mesh_Ewald(nn.Cell): | |||||
| """class Particle_Mesh_Ewald""" | |||||
| class Particle_Mesh_Ewald(): | |||||
| '''PME''' | |||||
| def __init__(self, controller, md_info): | def __init__(self, controller, md_info): | ||||
| super(Particle_Mesh_Ewald, self).__init__() | |||||
| self.cutoff = 10.0 if "cut" not in controller.Command_Set else float(controller.Command_Set["cut"]) | self.cutoff = 10.0 if "cut" not in controller.Command_Set else float(controller.Command_Set["cut"]) | ||||
| self.tolerance = 0.00001 if "PME_Direct_Tolerance" not in controller.Command_Set else float( | self.tolerance = 0.00001 if "PME_Direct_Tolerance" not in controller.Command_Set else float( | ||||
| controller.Command_Set["PME_Direct_Tolerance"]) | controller.Command_Set["PME_Direct_Tolerance"]) | ||||
| @@ -43,12 +36,9 @@ class Particle_Mesh_Ewald(nn.Cell): | |||||
| self.fftz = self.Get_Fft_Patameter(self.box_length[2]) | self.fftz = self.Get_Fft_Patameter(self.box_length[2]) | ||||
| self.beta = self.Get_Beta(self.cutoff, self.tolerance) | self.beta = self.Get_Beta(self.cutoff, self.tolerance) | ||||
| self.box_length = Tensor(np.asarray(self.box_length, np.float32), mstype.float32) | |||||
| print("========== ", self.fftx, self.ffty, self.fftz, self.tolerance, self.beta) | |||||
| def Get_Beta(self, cutoff, tolerance): | def Get_Beta(self, cutoff, tolerance): | ||||
| """get beta""" | |||||
| '''GET BETA''' | |||||
| high = 1.0 | high = 1.0 | ||||
| ihigh = 1 | ihigh = 1 | ||||
| while 1: | while 1: | ||||
| @@ -69,7 +59,7 @@ class Particle_Mesh_Ewald(nn.Cell): | |||||
| return beta | return beta | ||||
| def Check_2357_Factor(self, number): | def Check_2357_Factor(self, number): | ||||
| """check 2357 factor""" | |||||
| '''CHECK FACTOR''' | |||||
| while number > 0: | while number > 0: | ||||
| if number == 1: | if number == 1: | ||||
| return 1 | return 1 | ||||
| @@ -101,7 +91,7 @@ class Particle_Mesh_Ewald(nn.Cell): | |||||
| return 0 | return 0 | ||||
| def Get_Fft_Patameter(self, length): | def Get_Fft_Patameter(self, length): | ||||
| """get fft parameter""" | |||||
| '''GET FFT PARAMETER''' | |||||
| tempi = math.ceil(length + 3) >> 2 << 2 | tempi = math.ceil(length + 3) >> 2 << 2 | ||||
| if 60 <= tempi <= 68: | if 60 <= tempi <= 68: | ||||
| tempi = 64 | tempi = 64 | ||||
| @@ -117,31 +107,3 @@ class Particle_Mesh_Ewald(nn.Cell): | |||||
| if self.Check_2357_Factor(tempi): | if self.Check_2357_Factor(tempi): | ||||
| return tempi | return tempi | ||||
| tempi += 4 | tempi += 4 | ||||
| def PME_Energy(self, uint_crd, charge, nl_atom_numbers, nl_atom_serial, uint_dr_to_dr_cof, excluded_list_start, | |||||
| excluded_list, excluded_numbers, excluded_atom_numbers): | |||||
| """PME_Energy""" | |||||
| self.pmee = P.PMEEnergy(self.atom_numbers, excluded_atom_numbers, self.beta, self.fftx, self.ffty, self.fftz) | |||||
| self.reciprocal_energy, self.self_energy, self.direct_energy, self.correction_energy = \ | |||||
| self.pmee(self.box_length, uint_crd, charge, nl_atom_numbers, nl_atom_serial, uint_dr_to_dr_cof, | |||||
| excluded_list_start, excluded_list, excluded_numbers) | |||||
| return self.reciprocal_energy, self.self_energy, self.direct_energy, self.correction_energy | |||||
| def PME_Excluded_Force(self, uint_crd, scaler, charge, excluded_list_start, excluded_list, | |||||
| excluded_numbers, excluded_atom_numbers): | |||||
| """PME Excluded Force""" | |||||
| self.pmeef = P.PMEExcludedForce(atom_numbers=self.atom_numbers, excluded_numbers=excluded_atom_numbers, | |||||
| beta=self.beta) | |||||
| self.frc = self.pmeef(uint_crd, scaler, charge, excluded_list_start, excluded_list, excluded_numbers) | |||||
| return self.frc | |||||
| def PME_Reciprocal_Force(self, uint_crd, charge): | |||||
| """PME reciprocal force""" | |||||
| self.pmerf = P.PMEReciprocalForce(self.atom_numbers, self.beta, self.fftx, self.ffty, self.fftz) | |||||
| self.frc = self.pmerf(self.box_length, uint_crd, charge) | |||||
| return self.frc | |||||
| def Energy_Device_To_Host(self): | |||||
| """Energy_Device_To_Host""" | |||||
| self.ee_ene = self.reciprocal_energy + self.self_energy + self.direct_energy + self.correction_energy | |||||
| return self.ee_ene | |||||
| @@ -0,0 +1,439 @@ | |||||
| # Copyright 2021 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| '''Simulation''' | |||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor | |||||
| from mindspore import nn | |||||
| from mindspore.common.parameter import Parameter | |||||
| from mindspore.ops import functional as F | |||||
| from mindspore.ops import operations as P | |||||
| from src.angle import Angle | |||||
| from src.bond import Bond | |||||
| from src.dihedral import Dihedral | |||||
| from src.langevin_liujian_md import Langevin_Liujian | |||||
| from src.lennard_jones import Lennard_Jones_Information | |||||
| from src.md_information import md_information | |||||
| from src.nb14 import NON_BOND_14 | |||||
| from src.neighbor_list import neighbor_list | |||||
| from src.particle_mesh_ewald import Particle_Mesh_Ewald | |||||
| class controller: | |||||
| '''controller''' | |||||
| def __init__(self, args_opt): | |||||
| self.input_file = args_opt.i | |||||
| self.initial_coordinates_file = args_opt.c | |||||
| self.amber_parm = args_opt.amber_parm | |||||
| self.restrt = args_opt.r | |||||
| self.mdcrd = args_opt.x | |||||
| self.mdout = args_opt.o | |||||
| self.mdbox = args_opt.box | |||||
| self.Command_Set = {} | |||||
| self.md_task = None | |||||
| self.commands_from_in_file() | |||||
| def commands_from_in_file(self): | |||||
| '''command from in file''' | |||||
| file = open(self.input_file, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.md_task = context[0].strip() | |||||
| for val in context: | |||||
| if "=" in val: | |||||
| assert len(val.strip().split("=")) == 2 | |||||
| flag, value = val.strip().split("=") | |||||
| value = value.replace(",", '') | |||||
| flag = flag.replace(" ", "") | |||||
| if flag not in self.Command_Set: | |||||
| self.Command_Set[flag] = value | |||||
| else: | |||||
| print("ERROR COMMAND FILE") | |||||
| class Simulation(nn.Cell): | |||||
| '''simulation''' | |||||
| def __init__(self, args_opt): | |||||
| super(Simulation, self).__init__() | |||||
| self.control = controller(args_opt) | |||||
| self.md_info = md_information(self.control) | |||||
| self.bond = Bond(self.control, self.md_info) | |||||
| self.angle = Angle(self.control) | |||||
| self.dihedral = Dihedral(self.control) | |||||
| self.nb14 = NON_BOND_14(self.control, self.dihedral, self.md_info.atom_numbers) | |||||
| self.nb_info = neighbor_list(self.control, self.md_info.atom_numbers, self.md_info.box_length) | |||||
| self.LJ_info = Lennard_Jones_Information(self.control) | |||||
| self.liujian_info = Langevin_Liujian(self.control, self.md_info.atom_numbers) | |||||
| self.pme_method = Particle_Mesh_Ewald(self.control, self.md_info) | |||||
| self.bond_energy_sum = Tensor(0, mstype.int32) | |||||
| self.angle_energy_sum = Tensor(0, mstype.int32) | |||||
| self.dihedral_energy_sum = Tensor(0, mstype.int32) | |||||
| self.nb14_lj_energy_sum = Tensor(0, mstype.int32) | |||||
| self.nb14_cf_energy_sum = Tensor(0, mstype.int32) | |||||
| self.lj_energy_sum = Tensor(0, mstype.int32) | |||||
| self.ee_ene = Tensor(0, mstype.int32) | |||||
| self.total_energy = Tensor(0, mstype.int32) | |||||
| # Init scalar | |||||
| self.ntwx = self.md_info.ntwx | |||||
| self.atom_numbers = self.md_info.atom_numbers | |||||
| self.residue_numbers = self.md_info.residue_numbers | |||||
| self.bond_numbers = self.bond.bond_numbers | |||||
| self.angle_numbers = self.angle.angle_numbers | |||||
| self.dihedral_numbers = self.dihedral.dihedral_numbers | |||||
| self.nb14_numbers = self.nb14.nb14_numbers | |||||
| self.Nxy = self.nb_info.Nxy | |||||
| self.grid_numbers = self.nb_info.grid_numbers | |||||
| self.max_atom_in_grid_numbers = self.nb_info.max_atom_in_grid_numbers | |||||
| self.max_neighbor_numbers = self.nb_info.max_neighbor_numbers | |||||
| self.excluded_atom_numbers = self.nb_info.excluded_atom_numbers | |||||
| self.refresh_count = Parameter(Tensor(self.nb_info.refresh_count, mstype.int32), requires_grad=False) | |||||
| self.refresh_interval = self.nb_info.refresh_interval | |||||
| self.skin = self.nb_info.skin | |||||
| self.cutoff = self.nb_info.cutoff | |||||
| self.cutoff_square = self.nb_info.cutoff_square | |||||
| self.cutoff_with_skin = self.nb_info.cutoff_with_skin | |||||
| self.half_cutoff_with_skin = self.nb_info.half_cutoff_with_skin | |||||
| self.cutoff_with_skin_square = self.nb_info.cutoff_with_skin_square | |||||
| self.half_skin_square = self.nb_info.half_skin_square | |||||
| self.beta = self.pme_method.beta | |||||
| self.fftx = self.pme_method.fftx | |||||
| self.ffty = self.pme_method.ffty | |||||
| self.fftz = self.pme_method.fftz | |||||
| self.random_seed = self.liujian_info.rand_seed | |||||
| self.dt = self.liujian_info.dt | |||||
| self.half_dt = self.liujian_info.half_dt | |||||
| self.exp_gamma = self.liujian_info.exp_gamma | |||||
| self.init_Tensor() | |||||
| self.op_define() | |||||
| def init_Tensor(self): | |||||
| '''init tensor''' | |||||
| self.crd = Parameter( | |||||
| Tensor(np.float32(np.asarray(self.md_info.coordinate).reshape([self.atom_numbers, 3])), mstype.float32), | |||||
| requires_grad=False) | |||||
| self.crd_to_uint_crd_cof = Tensor(np.asarray(self.md_info.crd_to_uint_crd_cof, np.float32), mstype.float32) | |||||
| self.uint_dr_to_dr_cof = Parameter( | |||||
| Tensor(np.asarray(self.md_info.uint_dr_to_dr_cof, np.float32), mstype.float32), requires_grad=False) | |||||
| self.box_length = Tensor(self.md_info.box_length, mstype.float32) | |||||
| self.charge = Tensor(np.asarray(self.md_info.h_charge, dtype=np.float32), mstype.float32) | |||||
| self.old_crd = Parameter(Tensor(np.zeros([self.atom_numbers, 3], dtype=np.float32), mstype.float32), | |||||
| requires_grad=False) | |||||
| self.uint_crd = Parameter(Tensor(np.zeros([self.atom_numbers, 3], dtype=np.uint32), mstype.uint32), | |||||
| requires_grad=False) | |||||
| self.mass_inverse = Tensor(self.md_info.h_mass_inverse, mstype.float32) | |||||
| self.res_start = Tensor(self.md_info.h_res_start, mstype.int32) | |||||
| self.res_end = Tensor(self.md_info.h_res_end, mstype.int32) | |||||
| self.mass = Tensor(self.md_info.h_mass, mstype.float32) | |||||
| self.velocity = Parameter(Tensor(self.md_info.velocity, mstype.float32), requires_grad=False) | |||||
| self.acc = Parameter(Tensor(np.zeros([self.atom_numbers, 3], np.float32), mstype.float32), requires_grad=False) | |||||
| self.bond_atom_a = Tensor(np.asarray(self.bond.h_atom_a, np.int32), mstype.int32) | |||||
| self.bond_atom_b = Tensor(np.asarray(self.bond.h_atom_b, np.int32), mstype.int32) | |||||
| self.bond_k = Tensor(np.asarray(self.bond.h_k, np.float32), mstype.float32) | |||||
| self.bond_r0 = Tensor(np.asarray(self.bond.h_r0, np.float32), mstype.float32) | |||||
| self.angle_atom_a = Tensor(np.asarray(self.angle.h_atom_a, np.int32), mstype.int32) | |||||
| self.angle_atom_b = Tensor(np.asarray(self.angle.h_atom_b, np.int32), mstype.int32) | |||||
| self.angle_atom_c = Tensor(np.asarray(self.angle.h_atom_c, np.int32), mstype.int32) | |||||
| self.angle_k = Tensor(np.asarray(self.angle.h_angle_k, np.float32), mstype.float32) | |||||
| self.angle_theta0 = Tensor(np.asarray(self.angle.h_angle_theta0, np.float32), mstype.float32) | |||||
| self.dihedral_atom_a = Tensor(np.asarray(self.dihedral.h_atom_a, np.int32), mstype.int32) | |||||
| self.dihedral_atom_b = Tensor(np.asarray(self.dihedral.h_atom_b, np.int32), mstype.int32) | |||||
| self.dihedral_atom_c = Tensor(np.asarray(self.dihedral.h_atom_c, np.int32), mstype.int32) | |||||
| self.dihedral_atom_d = Tensor(np.asarray(self.dihedral.h_atom_d, np.int32), mstype.int32) | |||||
| self.pk = Tensor(np.asarray(self.dihedral.pk, np.float32), mstype.float32) | |||||
| self.gamc = Tensor(np.asarray(self.dihedral.gamc, np.float32), mstype.float32) | |||||
| self.gams = Tensor(np.asarray(self.dihedral.gams, np.float32), mstype.float32) | |||||
| self.pn = Tensor(np.asarray(self.dihedral.pn, np.float32), mstype.float32) | |||||
| self.ipn = Tensor(np.asarray(self.dihedral.ipn, np.int32), mstype.int32) | |||||
| self.nb14_atom_a = Tensor(np.asarray(self.nb14.h_atom_a, np.int32), mstype.int32) | |||||
| self.nb14_atom_b = Tensor(np.asarray(self.nb14.h_atom_b, np.int32), mstype.int32) | |||||
| self.lj_scale_factor = Tensor(np.asarray(self.nb14.h_lj_scale_factor, np.float32), mstype.float32) | |||||
| self.cf_scale_factor = Tensor(np.asarray(self.nb14.h_cf_scale_factor, np.float32), mstype.float32) | |||||
| self.grid_N = Tensor(self.nb_info.grid_N, mstype.int32) | |||||
| self.grid_length_inverse = Tensor(self.nb_info.grid_length_inverse, mstype.float32) | |||||
| self.bucket = Parameter(Tensor( | |||||
| np.asarray(self.nb_info.bucket, np.int32).reshape([self.grid_numbers, self.max_atom_in_grid_numbers]), | |||||
| mstype.int32), requires_grad=False) | |||||
| self.atom_numbers_in_grid_bucket = Parameter(Tensor(self.nb_info.atom_numbers_in_grid_bucket, mstype.int32), | |||||
| requires_grad=False) | |||||
| self.atom_in_grid_serial = Parameter(Tensor(np.zeros([self.nb_info.atom_numbers,], np.int32), mstype.int32), | |||||
| requires_grad=False) | |||||
| self.pointer = Parameter( | |||||
| Tensor(np.asarray(self.nb_info.pointer, np.int32).reshape([self.grid_numbers, 125]), mstype.int32), | |||||
| requires_grad=False) | |||||
| self.nl_atom_numbers = Parameter(Tensor(np.zeros([self.atom_numbers,], np.int32), mstype.int32), | |||||
| requires_grad=False) | |||||
| self.nl_atom_serial = Parameter( | |||||
| Tensor(np.zeros([self.atom_numbers, self.max_neighbor_numbers], np.int32), mstype.int32), | |||||
| requires_grad=False) | |||||
| self.excluded_list_start = Tensor(np.asarray(self.nb_info.excluded_list_start, np.int32), mstype.int32) | |||||
| self.excluded_list = Tensor(np.asarray(self.nb_info.excluded_list, np.int32), mstype.int32) | |||||
| self.excluded_numbers = Tensor(np.asarray(self.nb_info.excluded_numbers, np.int32), mstype.int32) | |||||
| self.need_refresh_flag = Tensor(np.asarray([0], np.int32), mstype.int32) | |||||
| self.atom_LJ_type = Tensor(np.asarray(self.LJ_info.atom_LJ_type, dtype=np.int32), mstype.int32) | |||||
| self.LJ_A = Tensor(np.asarray(self.LJ_info.LJ_A, dtype=np.float32), mstype.float32) | |||||
| self.LJ_B = Tensor(np.asarray(self.LJ_info.LJ_B, dtype=np.float32), mstype.float32) | |||||
| self.sqrt_mass = Tensor(self.liujian_info.h_sqrt_mass, mstype.float32) | |||||
| self.rand_state = Parameter(Tensor(self.liujian_info.rand_state, mstype.float32)) | |||||
| self.zero_fp_tensor = Tensor(np.asarray([0,], np.float32)) | |||||
| def op_define(self): | |||||
| '''op define''' | |||||
| self.crd_to_uint_crd = P.CrdToUintCrd(self.atom_numbers) | |||||
| self.mdtemp = P.MDTemperature(self.residue_numbers, self.atom_numbers) | |||||
| self.setup_random_state = P.MDIterationSetupRandState(self.atom_numbers, self.random_seed) | |||||
| self.bond_force_with_atom_energy = P.BondForceWithAtomEnergy(bond_numbers=self.bond_numbers, | |||||
| atom_numbers=self.atom_numbers) | |||||
| self.angle_force_with_atom_energy = P.AngleForceWithAtomEnergy(angle_numbers=self.angle_numbers) | |||||
| self.dihedral_force_with_atom_energy = P.DihedralForceWithAtomEnergy(dihedral_numbers=self.dihedral_numbers) | |||||
| self.nb14_force_with_atom_energy = P.Dihedral14LJCFForceWithAtomEnergy(nb14_numbers=self.nb14_numbers, | |||||
| atom_numbers=self.atom_numbers) | |||||
| self.lj_force_pme_direct_force = P.LJForceWithPMEDirectForce(self.atom_numbers, self.cutoff, self.beta) | |||||
| self.pme_excluded_force = P.PMEExcludedForce(atom_numbers=self.atom_numbers, | |||||
| excluded_numbers=self.excluded_atom_numbers, beta=self.beta) | |||||
| self.pme_reciprocal_force = P.PMEReciprocalForce(self.atom_numbers, self.beta, self.fftx, self.ffty, self.fftz, | |||||
| self.md_info.box_length[0], self.md_info.box_length[1], | |||||
| self.md_info.box_length[2]) | |||||
| self.bond_energy = P.BondEnergy(self.bond_numbers, self.atom_numbers) | |||||
| self.angle_energy = P.AngleEnergy(self.angle_numbers) | |||||
| self.dihedral_energy = P.DihedralEnergy(self.dihedral_numbers) | |||||
| self.nb14_lj_energy = P.Dihedral14LJEnergy(self.nb14_numbers, self.atom_numbers) | |||||
| self.nb14_cf_energy = P.Dihedral14CFEnergy(self.nb14_numbers, self.atom_numbers) | |||||
| self.lj_energy = P.LJEnergy(self.atom_numbers, self.cutoff_square) | |||||
| self.pme_energy = P.PMEEnergy(self.atom_numbers, self.excluded_atom_numbers, self.beta, self.fftx, self.ffty, | |||||
| self.fftz, self.md_info.box_length[0], self.md_info.box_length[1], | |||||
| self.md_info.box_length[2]) | |||||
| self.md_iteration_leap_frog_liujian = P.MDIterationLeapFrogLiujian(self.atom_numbers, self.half_dt, self.dt, | |||||
| self.exp_gamma) | |||||
| self.neighbor_list_update_init = P.NeighborListUpdate(grid_numbers=self.grid_numbers, | |||||
| atom_numbers=self.atom_numbers, not_first_time=0, | |||||
| Nxy=self.Nxy, | |||||
| excluded_atom_numbers=self.excluded_atom_numbers, | |||||
| cutoff_square=self.cutoff_square, | |||||
| half_skin_square=self.half_skin_square, | |||||
| cutoff_with_skin=self.cutoff_with_skin, | |||||
| half_cutoff_with_skin=self.half_cutoff_with_skin, | |||||
| cutoff_with_skin_square=self.cutoff_with_skin_square, | |||||
| refresh_interval=self.refresh_interval, | |||||
| cutoff=self.cutoff, skin=self.skin, | |||||
| max_atom_in_grid_numbers=self.max_atom_in_grid_numbers, | |||||
| max_neighbor_numbers=self.max_neighbor_numbers) | |||||
| self.neighbor_list_update = P.NeighborListUpdate(grid_numbers=self.grid_numbers, atom_numbers=self.atom_numbers, | |||||
| not_first_time=1, Nxy=self.Nxy, | |||||
| excluded_atom_numbers=self.excluded_atom_numbers, | |||||
| cutoff_square=self.cutoff_square, | |||||
| half_skin_square=self.half_skin_square, | |||||
| cutoff_with_skin=self.cutoff_with_skin, | |||||
| half_cutoff_with_skin=self.half_cutoff_with_skin, | |||||
| cutoff_with_skin_square=self.cutoff_with_skin_square, | |||||
| refresh_interval=self.refresh_interval, cutoff=self.cutoff, | |||||
| skin=self.skin, | |||||
| max_atom_in_grid_numbers=self.max_atom_in_grid_numbers, | |||||
| max_neighbor_numbers=self.max_neighbor_numbers) | |||||
| self.random_force = Tensor(np.zeros([self.atom_numbers, 3], np.float32), mstype.float32) | |||||
| def Simulation_Beforce_Caculate_Force(self): | |||||
| '''simulation before calculate force''' | |||||
| crd_to_uint_crd_cof = 0.5 * self.crd_to_uint_crd_cof | |||||
| uint_crd = self.crd_to_uint_crd(crd_to_uint_crd_cof, self.crd) | |||||
| return uint_crd | |||||
| def Simulation_Caculate_Force(self, uint_crd, scaler, nl_atom_numbers, nl_atom_serial): | |||||
| '''simulation calculate force''' | |||||
| bond_force, _ = self.bond_force_with_atom_energy(uint_crd, scaler, self.bond_atom_a, | |||||
| self.bond_atom_b, self.bond_k, self.bond_r0) | |||||
| angle_force, _ = self.angle_force_with_atom_energy(uint_crd, scaler, self.angle_atom_a, | |||||
| self.angle_atom_b, self.angle_atom_c, | |||||
| self.angle_k, self.angle_theta0) | |||||
| dihedral_force, _ = self.dihedral_force_with_atom_energy(uint_crd, scaler, | |||||
| self.dihedral_atom_a, | |||||
| self.dihedral_atom_b, | |||||
| self.dihedral_atom_c, | |||||
| self.dihedral_atom_d, self.ipn, | |||||
| self.pk, self.gamc, self.gams, | |||||
| self.pn) | |||||
| nb14_force, _ = self.nb14_force_with_atom_energy(uint_crd, self.atom_LJ_type, self.charge, | |||||
| scaler, self.nb14_atom_a, self.nb14_atom_b, | |||||
| self.lj_scale_factor, self.cf_scale_factor, | |||||
| self.LJ_A, self.LJ_B) | |||||
| lj_force = self.lj_force_pme_direct_force(uint_crd, self.atom_LJ_type, self.charge, scaler, nl_atom_numbers, | |||||
| nl_atom_serial, self.LJ_A, self.LJ_B) | |||||
| pme_excluded_force = self.pme_excluded_force(uint_crd, scaler, self.charge, self.excluded_list_start, | |||||
| self.excluded_list, self.excluded_numbers) | |||||
| pme_reciprocal_force = self.pme_reciprocal_force(uint_crd, self.charge) | |||||
| force = P.AddN()( | |||||
| [bond_force, angle_force, dihedral_force, nb14_force, lj_force, pme_excluded_force, pme_reciprocal_force]) | |||||
| return force | |||||
| def Simulation_Caculate_Energy(self, uint_crd, uint_dr_to_dr_cof): | |||||
| '''simulation calculate energy''' | |||||
| bond_energy = self.bond_energy(uint_crd, uint_dr_to_dr_cof, self.bond_atom_a, self.bond_atom_b, self.bond_k, | |||||
| self.bond_r0) | |||||
| bond_energy_sum = P.ReduceSum(True)(bond_energy) | |||||
| angle_energy = self.angle_energy(uint_crd, uint_dr_to_dr_cof, self.angle_atom_a, self.angle_atom_b, | |||||
| self.angle_atom_c, self.angle_k, self.angle_theta0) | |||||
| angle_energy_sum = P.ReduceSum(True)(angle_energy) | |||||
| dihedral_energy = self.dihedral_energy(uint_crd, uint_dr_to_dr_cof, self.dihedral_atom_a, self.dihedral_atom_b, | |||||
| self.dihedral_atom_c, self.dihedral_atom_d, self.ipn, self.pk, self.gamc, | |||||
| self.gams, self.pn) | |||||
| dihedral_energy_sum = P.ReduceSum(True)(dihedral_energy) | |||||
| nb14_lj_energy = self.nb14_lj_energy(uint_crd, self.atom_LJ_type, self.charge, uint_dr_to_dr_cof, | |||||
| self.nb14_atom_a, self.nb14_atom_b, self.lj_scale_factor, self.LJ_A, | |||||
| self.LJ_B) | |||||
| nb14_cf_energy = self.nb14_cf_energy(uint_crd, self.atom_LJ_type, self.charge, uint_dr_to_dr_cof, | |||||
| self.nb14_atom_a, self.nb14_atom_b, self.cf_scale_factor) | |||||
| nb14_lj_energy_sum = P.ReduceSum(True)(nb14_lj_energy) | |||||
| nb14_cf_energy_sum = P.ReduceSum(True)(nb14_cf_energy) | |||||
| lj_energy = self.lj_energy(uint_crd, self.atom_LJ_type, self.charge, uint_dr_to_dr_cof, self.nl_atom_numbers, | |||||
| self.nl_atom_serial, self.LJ_A, self.LJ_B) | |||||
| lj_energy_sum = P.ReduceSum(True)(lj_energy) | |||||
| reciprocal_energy, self_energy, direct_energy, correction_energy = self.pme_energy(uint_crd, self.charge, | |||||
| self.nl_atom_numbers, | |||||
| self.nl_atom_serial, | |||||
| uint_dr_to_dr_cof, | |||||
| self.excluded_list_start, | |||||
| self.excluded_list, | |||||
| self.excluded_numbers) | |||||
| ee_ene = reciprocal_energy + self_energy + direct_energy + correction_energy | |||||
| total_energy = P.AddN()( | |||||
| [bond_energy_sum, angle_energy_sum, dihedral_energy_sum, nb14_lj_energy_sum, nb14_cf_energy_sum, | |||||
| lj_energy_sum, ee_ene]) | |||||
| return bond_energy_sum, angle_energy_sum, dihedral_energy_sum, nb14_lj_energy_sum, nb14_cf_energy_sum, \ | |||||
| lj_energy_sum, ee_ene, total_energy | |||||
| def Simulation_Temperature(self): | |||||
| '''caculate temperature''' | |||||
| res_ek_energy = self.mdtemp(self.res_start, self.res_end, self.velocity, self.mass) | |||||
| temperature = P.ReduceSum()(res_ek_energy) | |||||
| return temperature | |||||
| def Simulation_MDIterationLeapFrog_Liujian(self, inverse_mass, sqrt_mass_inverse, crd, frc, rand_state, random_frc): | |||||
| '''simulation leap frog iteration liujian''' | |||||
| crd = self.md_iteration_leap_frog_liujian(inverse_mass, sqrt_mass_inverse, self.velocity, crd, frc, self.acc, | |||||
| rand_state, random_frc) | |||||
| vel = F.depend(self.velocity, crd) | |||||
| acc = F.depend(self.acc, crd) | |||||
| return vel, crd, acc | |||||
| def construct(self, step, print_step): | |||||
| '''construct''' | |||||
| if step == 0: | |||||
| res = self.neighbor_list_update_init(self.atom_numbers_in_grid_bucket, self.bucket, self.crd, | |||||
| self.box_length, self.grid_N, self.grid_length_inverse, | |||||
| self.atom_in_grid_serial, self.old_crd, self.crd_to_uint_crd_cof, | |||||
| self.uint_crd, self.pointer, self.nl_atom_numbers, self.nl_atom_serial, | |||||
| self.uint_dr_to_dr_cof, self.excluded_list_start, self.excluded_list, | |||||
| self.excluded_numbers, self.need_refresh_flag, self.refresh_count) | |||||
| self.nl_atom_numbers = F.depend(self.nl_atom_numbers, res) | |||||
| self.nl_atom_serial = F.depend(self.nl_atom_serial, res) | |||||
| self.uint_dr_to_dr_cof = F.depend(self.uint_dr_to_dr_cof, res) | |||||
| self.old_crd = F.depend(self.old_crd, res) | |||||
| self.atom_numbers_in_grid_bucket = F.depend(self.atom_numbers_in_grid_bucket, res) | |||||
| self.bucket = F.depend(self.bucket, res) | |||||
| self.atom_in_grid_serial = F.depend(self.atom_in_grid_serial, res) | |||||
| self.pointer = F.depend(self.pointer, res) | |||||
| uint_crd = F.depend(self.uint_crd, res) | |||||
| force = self.Simulation_Caculate_Force(uint_crd, self.uint_dr_to_dr_cof, self.nl_atom_numbers, | |||||
| self.nl_atom_serial) | |||||
| bond_energy_sum, angle_energy_sum, dihedral_energy_sum, nb14_lj_energy_sum, nb14_cf_energy_sum, \ | |||||
| lj_energy_sum, ee_ene, total_energy = self.Simulation_Caculate_Energy(uint_crd, self.uint_dr_to_dr_cof) | |||||
| temperature = self.Simulation_Temperature() | |||||
| self.rand_state = self.setup_random_state() | |||||
| self.velocity, self.crd, _ = self.Simulation_MDIterationLeapFrog_Liujian(self.mass_inverse, | |||||
| self.sqrt_mass, self.crd, force, | |||||
| self.rand_state, | |||||
| self.random_force) | |||||
| res = self.neighbor_list_update(self.atom_numbers_in_grid_bucket, | |||||
| self.bucket, | |||||
| self.crd, | |||||
| self.box_length, | |||||
| self.grid_N, | |||||
| self.grid_length_inverse, | |||||
| self.atom_in_grid_serial, | |||||
| self.old_crd, | |||||
| self.crd_to_uint_crd_cof, | |||||
| self.uint_crd, | |||||
| self.pointer, | |||||
| self.nl_atom_numbers, | |||||
| self.nl_atom_serial, | |||||
| self.uint_dr_to_dr_cof, | |||||
| self.excluded_list_start, | |||||
| self.excluded_list, | |||||
| self.excluded_numbers, | |||||
| self.need_refresh_flag, | |||||
| self.refresh_count) | |||||
| self.nl_atom_numbers = F.depend(self.nl_atom_numbers, res) | |||||
| self.nl_atom_serial = F.depend(self.nl_atom_serial, res) | |||||
| else: | |||||
| uint_crd = self.Simulation_Beforce_Caculate_Force() | |||||
| force = self.Simulation_Caculate_Force(uint_crd, self.uint_dr_to_dr_cof, self.nl_atom_numbers, | |||||
| self.nl_atom_serial) | |||||
| if print_step == 0: | |||||
| bond_energy_sum, angle_energy_sum, dihedral_energy_sum, nb14_lj_energy_sum, nb14_cf_energy_sum, \ | |||||
| lj_energy_sum, ee_ene, total_energy = self.Simulation_Caculate_Energy( | |||||
| uint_crd, self.uint_dr_to_dr_cof) | |||||
| else: | |||||
| bond_energy_sum = self.zero_fp_tensor | |||||
| angle_energy_sum = self.zero_fp_tensor | |||||
| dihedral_energy_sum = self.zero_fp_tensor | |||||
| nb14_lj_energy_sum = self.zero_fp_tensor | |||||
| nb14_cf_energy_sum = self.zero_fp_tensor | |||||
| lj_energy_sum = self.zero_fp_tensor | |||||
| ee_ene = self.zero_fp_tensor | |||||
| total_energy = self.zero_fp_tensor | |||||
| temperature = self.Simulation_Temperature() | |||||
| self.velocity, self.crd, _ = self.Simulation_MDIterationLeapFrog_Liujian(self.mass_inverse, | |||||
| self.sqrt_mass, self.crd, force, | |||||
| self.rand_state, | |||||
| self.random_force) | |||||
| res = self.neighbor_list_update(self.atom_numbers_in_grid_bucket, | |||||
| self.bucket, | |||||
| self.crd, | |||||
| self.box_length, | |||||
| self.grid_N, | |||||
| self.grid_length_inverse, | |||||
| self.atom_in_grid_serial, | |||||
| self.old_crd, | |||||
| self.crd_to_uint_crd_cof, | |||||
| self.uint_crd, | |||||
| self.pointer, | |||||
| self.nl_atom_numbers, | |||||
| self.nl_atom_serial, | |||||
| self.uint_dr_to_dr_cof, | |||||
| self.excluded_list_start, | |||||
| self.excluded_list, | |||||
| self.excluded_numbers, | |||||
| self.need_refresh_flag, | |||||
| self.refresh_count) | |||||
| self.nl_atom_numbers = F.depend(self.nl_atom_numbers, res) | |||||
| self.nl_atom_serial = F.depend(self.nl_atom_serial, res) | |||||
| return temperature, total_energy, bond_energy_sum, angle_energy_sum, dihedral_energy_sum, nb14_lj_energy_sum, \ | |||||
| nb14_cf_energy_sum, lj_energy_sum, ee_ene, res | |||||
| @@ -1,245 +0,0 @@ | |||||
| # Copyright 2021 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """simulation""" | |||||
| import numpy as np | |||||
| import mindspore.common.dtype as mstype | |||||
| from mindspore import Tensor, nn | |||||
| from .Langevin_Liujian_md import Langevin_Liujian | |||||
| from .angle import Angle | |||||
| from .bond import Bond | |||||
| from .dihedral import Dihedral | |||||
| from .lennard_jones import Lennard_Jones_Information | |||||
| from .md_information import md_information | |||||
| from .nb14 import NON_BOND_14 | |||||
| from .neighbor_list import nb_infomation | |||||
| from .particle_mesh_ewald import Particle_Mesh_Ewald | |||||
| class controller: | |||||
| """class controller""" | |||||
| def __init__(self, args_opt): | |||||
| self.input_file = args_opt.i | |||||
| self.initial_coordinates_file = args_opt.c | |||||
| self.amber_parm = args_opt.amber_parm | |||||
| self.restrt = args_opt.r | |||||
| self.mdcrd = args_opt.x | |||||
| self.mdout = args_opt.o | |||||
| self.mdbox = args_opt.box | |||||
| self.Command_Set = {} | |||||
| self.md_task = None | |||||
| self.commands_from_in_file() | |||||
| def commands_from_in_file(self): | |||||
| """commands from in file""" | |||||
| file = open(self.input_file, 'r') | |||||
| context = file.readlines() | |||||
| file.close() | |||||
| self.md_task = context[0].strip() | |||||
| for val in context: | |||||
| if "=" in val: | |||||
| assert len(val.strip().split("=")) == 2 | |||||
| flag, value = val.strip().split("=") | |||||
| value = value.replace(",", '') | |||||
| flag = flag.replace(" ", "") | |||||
| if flag not in self.Command_Set: | |||||
| self.Command_Set[flag] = value | |||||
| else: | |||||
| print("ERROR COMMAND FILE") | |||||
| class Simulation(nn.Cell): | |||||
| """class simulation""" | |||||
| def __init__(self, args_opt): | |||||
| super(Simulation, self).__init__() | |||||
| self.control = controller(args_opt) | |||||
| self.md_info = md_information(self.control) | |||||
| self.bond = Bond(self.control, self.md_info) | |||||
| self.angle = Angle(self.control) | |||||
| self.dihedral = Dihedral(self.control) | |||||
| self.nb14 = NON_BOND_14(self.control, self.dihedral, self.md_info.atom_numbers) | |||||
| self.nb_info = nb_infomation(self.control, self.md_info.atom_numbers, self.md_info.box_length) | |||||
| self.LJ_info = Lennard_Jones_Information(self.control) | |||||
| self.liujian_info = Langevin_Liujian(self.control, self.md_info.atom_numbers) | |||||
| self.pme_method = Particle_Mesh_Ewald(self.control, self.md_info) | |||||
| self.box_length = Tensor(np.asarray(self.md_info.box_length, np.float32), mstype.float32) | |||||
| self.file = None | |||||
| def Main_Before_Calculate_Force(self): | |||||
| """Main Before Calculate Force""" | |||||
| _ = self.md_info.MD_Information_Crd_To_Uint_Crd() | |||||
| self.md_info.uint_crd_with_LJ = (self.md_info.uint_crd, self.LJ_info.atom_LJ_type, self.md_info.charge) | |||||
| return self.md_info.uint_crd, self.md_info.uint_crd_with_LJ | |||||
| def Initial_Neighbor_List_Update(self, not_first_time): | |||||
| """Initial Neighbor List Update""" | |||||
| res = self.nb_info.NeighborListUpdate(self.md_info.crd, self.md_info.crd_old, self.md_info.uint_crd, | |||||
| self.md_info.crd_to_uint_crd_cof, self.md_info.uint_dr_to_dr_cof, | |||||
| self.box_length, not_first_time) | |||||
| return res | |||||
| def Main_Calculate_Force(self): | |||||
| """main calculate force""" | |||||
| self.bond.atom_numbers = self.md_info.atom_numbers | |||||
| md_info = self.md_info | |||||
| LJ_info = self.LJ_info | |||||
| nb_info = self.nb_info | |||||
| pme_method = self.pme_method | |||||
| bond_frc, _ = self.bond.Bond_Force_With_Atom_Energy(md_info.uint_crd, md_info.uint_dr_to_dr_cof) | |||||
| frc_t = 0 | |||||
| frc_t += bond_frc.asnumpy() | |||||
| angle_frc, _ = self.angle.Angle_Force_With_Atom_Energy(md_info.uint_crd, md_info.uint_dr_to_dr_cof) | |||||
| frc_t += angle_frc.asnumpy() | |||||
| dihedral_frc, _ = self.dihedral.Dihedral_Force_With_Atom_Energy(md_info.uint_crd, md_info.uint_dr_to_dr_cof) | |||||
| frc_t += dihedral_frc.asnumpy() | |||||
| nb14_frc, _ = self.nb14.Non_Bond_14_LJ_CF_Force_With_Atom_Energy(md_info.uint_crd_with_LJ, | |||||
| md_info.uint_dr_to_dr_cof, LJ_info.LJ_A, | |||||
| LJ_info.LJ_B) | |||||
| frc_t += nb14_frc.asnumpy() | |||||
| lj_frc = LJ_info.LJ_Force_With_PME_Direct_Force( | |||||
| md_info.atom_numbers, md_info.uint_crd_with_LJ, md_info.uint_dr_to_dr_cof, nb_info.nl_atom_numbers, | |||||
| nb_info.nl_atom_serial, nb_info.cutoff, pme_method.beta) | |||||
| frc_t += lj_frc.asnumpy() | |||||
| pme_excluded_frc = pme_method.PME_Excluded_Force( | |||||
| md_info.uint_crd, md_info.uint_dr_to_dr_cof, md_info.charge, | |||||
| nb_info.excluded_list_start, nb_info.excluded_list, | |||||
| nb_info.excluded_numbers, nb_info.excluded_atom_numbers) | |||||
| frc_t += pme_excluded_frc.asnumpy() | |||||
| pme_reciprocal_frc = pme_method.PME_Reciprocal_Force(md_info.uint_crd, md_info.charge) | |||||
| frc_t += pme_reciprocal_frc.asnumpy() | |||||
| self.md_info.frc = Tensor(frc_t, mstype.float32) | |||||
| return self.md_info.frc | |||||
| def Main_Calculate_Energy(self): | |||||
| """main calculate energy""" | |||||
| _ = self.bond.Bond_Energy(self.md_info.uint_crd, self.md_info.uint_dr_to_dr_cof) | |||||
| _ = self.angle.Angle_Energy(self.md_info.uint_crd, self.md_info.uint_dr_to_dr_cof) | |||||
| _ = self.dihedral.Dihedral_Engergy(self.md_info.uint_crd, self.md_info.uint_dr_to_dr_cof) | |||||
| _ = self.nb14.Non_Bond_14_LJ_CF_Energy(self.md_info.uint_crd_with_LJ, self.md_info.uint_dr_to_dr_cof, | |||||
| self.LJ_info.LJ_A, | |||||
| self.LJ_info.LJ_B) | |||||
| _ = self.LJ_info.LJ_Energy(self.md_info.uint_crd_with_LJ, self.md_info.uint_dr_to_dr_cof, | |||||
| self.nb_info.nl_atom_numbers, self.nb_info.nl_atom_serial, | |||||
| self.nb_info.cutoff_square) | |||||
| _ = self.pme_method.PME_Energy( | |||||
| self.md_info.uint_crd, self.md_info.charge, self.nb_info.nl_atom_numbers, self.nb_info.nl_atom_serial, | |||||
| self.md_info.uint_dr_to_dr_cof, self.nb_info.excluded_list_start, self.nb_info.excluded_list, | |||||
| self.nb_info.excluded_numbers, self.nb_info.excluded_atom_numbers) | |||||
| _ = self.pme_method.Energy_Device_To_Host() | |||||
| def Main_After_Calculate_Energy(self): | |||||
| """main after calculate energy""" | |||||
| md_info = self.md_info | |||||
| LJ_info = self.LJ_info | |||||
| bond = self.bond | |||||
| angle = self.angle | |||||
| dihedral = self.dihedral | |||||
| nb14 = self.nb14 | |||||
| pme_method = self.pme_method | |||||
| md_info.total_potential_energy = 0 | |||||
| md_info.total_potential_energy += bond.sigma_of_bond_ene | |||||
| md_info.total_potential_energy += angle.sigma_of_angle_ene | |||||
| md_info.total_potential_energy += dihedral.sigma_of_dihedral_ene | |||||
| md_info.total_potential_energy += nb14.nb14_lj_energy_sum + nb14.nb14_cf_energy_sum | |||||
| md_info.total_potential_energy += LJ_info.LJ_energy_sum | |||||
| pme_method.Energy_Device_To_Host() | |||||
| md_info.total_potential_energy += pme_method.ee_ene | |||||
| print("md_info.total_potential_energy", md_info.total_potential_energy) | |||||
| def Main_Iteration_2(self): | |||||
| """main iteration2""" | |||||
| md_info = self.md_info | |||||
| control = self.control | |||||
| liujian_info = self.liujian_info | |||||
| if md_info.mode > 0 and int(control.Command_Set["thermostat"]) == 1: | |||||
| md_info.vel, md_info.crd, md_info.frc, md_info.acc = liujian_info.MD_Iteration_Leap_Frog( | |||||
| md_info.d_mass_inverse, md_info.vel, md_info.crd, md_info.frc) | |||||
| self.Main_After_Iteration() | |||||
| def Main_After_Iteration(self): | |||||
| """main after iteration""" | |||||
| md_info = self.md_info | |||||
| nb_info = self.nb_info | |||||
| md_info.Centerize() | |||||
| _ = nb_info.NeighborListUpdate(md_info.crd, md_info.crd_old, md_info.uint_crd, | |||||
| md_info.crd_to_uint_crd_cof, | |||||
| md_info.uint_dr_to_dr_cof, self.box_length, not_first_time=1) | |||||
| def Main_Print(self): | |||||
| """compute the temperature""" | |||||
| md_info = self.md_info | |||||
| temperature = md_info.MD_Information_Temperature() | |||||
| md_info.h_temperature = temperature | |||||
| steps = md_info.steps | |||||
| temperature = temperature.asnumpy() | |||||
| total_potential_energy = md_info.total_potential_energy.asnumpy() | |||||
| sigma_of_bond_ene = self.bond.sigma_of_bond_ene.asnumpy() | |||||
| sigma_of_angle_ene = self.angle.sigma_of_angle_ene.asnumpy() | |||||
| sigma_of_dihedral_ene = self.dihedral.sigma_of_dihedral_ene.asnumpy() | |||||
| nb14_lj_energy_sum = self.nb14.nb14_lj_energy_sum.asnumpy() | |||||
| nb14_cf_energy_sum = self.nb14.nb14_cf_energy_sum.asnumpy() | |||||
| LJ_energy_sum = self.LJ_info.LJ_energy_sum.asnumpy() | |||||
| ee_ene = self.pme_method.ee_ene.asnumpy() | |||||
| print("_steps_ _TEMP_ _TOT_POT_ENE_ _BOND_ENE_ " | |||||
| "_ANGLE_ENE_ _DIHEDRAL_ENE_ _14LJ_ENE_ _14CF_ENE_ _LJ_ENE_ _CF_PME_ENE_") | |||||
| print("{:>7.0f} {:>7.3f} {:>11.3f}".format(steps, float(temperature), float(total_potential_energy)), end=" ") | |||||
| if self.bond.bond_numbers > 0: | |||||
| print("{:>10.3f}".format(float(sigma_of_bond_ene)), end=" ") | |||||
| if self.angle.angle_numbers > 0: | |||||
| print("{:>11.3f}".format(float(sigma_of_angle_ene)), end=" ") | |||||
| if self.dihedral.dihedral_numbers > 0: | |||||
| print("{:>14.3f}".format(float(sigma_of_dihedral_ene)), end=" ") | |||||
| if self.nb14.nb14_numbers > 0: | |||||
| print("{:>10.3f} {:>10.3f}".format(float(nb14_lj_energy_sum), float(nb14_cf_energy_sum)), end=" ") | |||||
| print("{:>7.3f}".format(float(LJ_energy_sum)), end=" ") | |||||
| print("{:>12.3f}".format(float(ee_ene))) | |||||
| if self.file is not None: | |||||
| self.file.write("{:>7.0f} {:>7.3f} {:>11.3f} {:>10.3f} {:>11.3f} {:>14.3f} {:>10.3f} {:>10.3f} {:>7.3f}" | |||||
| " {:>12.3f}\n".format(steps, float(temperature), float(total_potential_energy), | |||||
| float(sigma_of_bond_ene), float(sigma_of_angle_ene), | |||||
| float(sigma_of_dihedral_ene), float(nb14_lj_energy_sum), | |||||
| float(nb14_cf_energy_sum), float(LJ_energy_sum), float(ee_ene))) | |||||
| return temperature | |||||
| def Main_Initial(self): | |||||
| """main initial""" | |||||
| if self.control.mdout: | |||||
| self.file = open(self.control.mdout, 'w') | |||||
| self.file.write("_steps_ _TEMP_ _TOT_POT_ENE_ _BOND_ENE_ " | |||||
| "_ANGLE_ENE_ _DIHEDRAL_ENE_ _14LJ_ENE_ _14CF_ENE_ _LJ_ENE_ _CF_PME_ENE_\n") | |||||
| def Main_Destroy(self): | |||||
| """main destroy""" | |||||
| if self.file is not None: | |||||
| self.file.close() | |||||
| print("Save successfully!") | |||||