def test_pbc_small_box(self): data0 = Data() data1 = Data(box_scale=2) inter0 = Inter() inter1 = Inter() inter0.setUp(data0, pbc=True) inter1.setUp(data1, pbc=False) inter0.net_w_i = np.copy(np.ones(inter0.ndescrpt)) inter1.net_w_i = np.copy(np.ones(inter1.ndescrpt)) t_energy0, t_force0, t_virial0 \ = inter0.comp_ef (inter0.coord, inter0.box, inter0.type, inter0.tnatoms, name = "test_lf_pbc_sbox_true") t_energy1, t_force1, t_virial1 \ = inter1.comp_ef (inter1.coord, inter1.box, inter1.type, inter1.tnatoms, name = "test_lf_pbc_sbox_false") inter0.sess.run(tf.global_variables_initializer()) inter1.sess.run(tf.global_variables_initializer()) dcoord, dbox, dtype = data0.get_data() [e0, f0, v0] = inter0.sess.run( [t_energy0, t_force0, t_virial0], feed_dict={ inter0.coord: dcoord, inter0.box: dbox, inter0.type: dtype, inter0.tnatoms: inter0.natoms }) dcoord, dbox, dtype = data1.get_data() [e1, f1, v1] = inter1.sess.run( [t_energy1, t_force1, t_virial1], feed_dict={ inter1.coord: dcoord, inter1.box: dbox, inter1.type: dtype, inter1.tnatoms: inter1.natoms }) self.assertAlmostEqual(e0[0], e1[0]) for ii in range(f0[0].size): # print(ii) self.assertAlmostEqual(f0[0][ii], f1[0][ii]) for ii in range(v0[0].size): # print(ii) self.assertAlmostEqual(v0[0][ii], v1[0][ii])
def test_pbc(self): data = Data() inter0 = Inter() inter1 = Inter() inter0.setUp(data, pbc=True, sess=self.test_session().__enter__()) inter1.setUp(data, pbc=False, sess=self.test_session().__enter__()) inter0.net_w_i = np.copy(np.ones(inter0.ndescrpt)) inter1.net_w_i = np.copy(np.ones(inter1.ndescrpt)) t_energy0, t_force0, t_virial0 \ = inter0.comp_ef (inter0.coord, inter0.box, inter0.type, inter0.tnatoms, name = "test_ser_pbc_true") t_energy1, t_force1, t_virial1 \ = inter1.comp_ef (inter1.coord, inter1.box, inter1.type, inter1.tnatoms, name = "test_ser_pbc_false") inter0.sess.run(tf.global_variables_initializer()) inter1.sess.run(tf.global_variables_initializer()) dcoord, dbox, dtype = data.get_data() [e0, f0, v0] = inter0.sess.run( [t_energy0, t_force0, t_virial0], feed_dict={ inter0.coord: dcoord, inter0.box: dbox, inter0.type: dtype, inter0.tnatoms: inter0.natoms }) [e1, f1, v1] = inter1.sess.run( [t_energy1, t_force1, t_virial1], feed_dict={ inter1.coord: dcoord, inter1.box: dbox, inter1.type: dtype, inter1.tnatoms: inter1.natoms }) self.assertAlmostEqual(e0[0], e1[0]) np.testing.assert_almost_equal(f0[0], f1[0]) np.testing.assert_almost_equal(v0[0], v1[0])
def _test_fv(self): dcm = DipoleChargeModifier( str(tests_path / os.path.join(modifier_datapath, "dipole.pb")), [-8], [6, 1], 1, 0.25) data = Data() coord, box, atype = data.get_data() atype = atype[0] ve, vf, vv = dcm.eval(coord, box, atype) hh = global_default_fv_hh hh = 1e-4 places = global_default_places places = 1 nframes = coord.shape[0] ndof = coord.shape[1] natoms = ndof // 3 vf = np.reshape(vf, [nframes, -1]) for ii in range(ndof): coordp = np.copy(coord) coordm = np.copy(coord) coordp[:, ii] += hh coordm[:, ii] -= hh ep, _, __ = dcm.eval(coordp, box, atype, eval_fv=False) em, _, __ = dcm.eval(coordm, box, atype, eval_fv=False) num_f = -(ep - em) / (2. * hh) np.testing.assert_almost_equal(vf[:, ii].ravel(), num_f.ravel(), places, err_msg='dof %d does not match' % (ii)) box3 = np.reshape(box, [nframes, 3, 3]) rbox3 = np.linalg.inv(box3) coord3 = np.reshape(coord, [nframes, natoms, 3]) rcoord3 = np.matmul(coord3, rbox3) num_deriv = np.zeros([nframes, 3, 3]) for ii in range(3): for jj in range(3): box3p = np.copy(box3) box3m = np.copy(box3) box3p[:, ii, jj] = box3[:, ii, jj] + hh box3m[:, ii, jj] = box3[:, ii, jj] - hh boxp = np.reshape(box3p, [-1, 9]) boxm = np.reshape(box3m, [-1, 9]) coord3p = np.matmul(rcoord3, box3p) coord3m = np.matmul(rcoord3, box3m) coordp = np.reshape(coord3p, [nframes, -1]) coordm = np.reshape(coord3m, [nframes, -1]) ep, _, __ = dcm.eval(coordp, boxp, atype, eval_fv=False) em, _, __ = dcm.eval(coordm, boxm, atype, eval_fv=False) num_deriv[:, ii, jj] = -(ep - em) / (2. * hh) # box3t = np.transpose(box3, [0,2,1]) # t_esti = np.matmul(num_deriv, box3t) num_deriv = np.transpose(num_deriv, [0, 2, 1]) t_esti = np.matmul(num_deriv, box3) # print(t_esti, '\n', vv.reshape([-1, 3, 3])) np.testing.assert_almost_equal(t_esti.ravel(), vv.ravel(), places, err_msg="virial component failed")