Esempio n. 1
0
    def one_step(self, q_list0, p_list0, l_list):

        # update p0 -> p1
        p_input0 = self.force_function.prepare_p_input(q_list0, p_list0,
                                                       l_list)
        q_input0 = self.force_function.prepare_q_input(0, q_list0, p_list0,
                                                       l_list)
        p_input_list = [p_input0]
        q_input_list = [q_input0]
        p_list1 = p_list0 + self.force_function.eval(q_input_list,
                                                     p_input_list)

        # update q0 -> q1
        p_input1 = self.force_function.prepare_p_input(
            q_list0, p_list1,
            l_list)  ##### note, use q_list0 instead of q_list1
        p_input_list.append(p_input1)
        q_list1 = q_list0 + self.force_function.eval(q_input_list,
                                                     p_input_list)
        #q_list1.retain_grad()
        q_list1 = pbc(q_list1, l_list)

        # update p1 -> p2
        q_input1 = self.force_function.prepare_q_input(1, q_list1, p_list1,
                                                       l_list)
        q_input_list.append(q_input1)
        p_list2 = p_list1 + self.force_function.eval(q_input_list,
                                                     p_input_list)

        # update q1 -> q2
        p_input2 = self.force_function.prepare_p_input(
            q_list1, p_list2,
            l_list)  ##### note, use q_list1 instead of q_list2
        p_input_list.append(p_input2)
        q_list2 = q_list1 + self.force_function.eval(q_input_list,
                                                     p_input_list)
        #q_list2.retain_grad()
        q_list2 = pbc(q_list2, l_list)

        # update p2 -> p3
        q_input2 = self.force_function.prepare_q_input(2, q_list2, p_list2,
                                                       l_list)
        q_input_list.append(q_input2)
        p_list3 = p_list2 + self.force_function.eval(q_input_list,
                                                     p_input_list)

        # update q2 -> q3
        p_input3 = self.force_function.prepare_p_input(
            q_list2, p_list3,
            l_list)  ##### note, use q_list2 instead of q_list3
        p_input_list.append(p_input3)
        q_list3 = q_list2 + self.force_function.eval(q_input_list,
                                                     p_input_list)
        #q_list3.retain_grad()
        q_list3 = pbc(q_list3, l_list)

        assert_nan(p_list3)
        assert_nan(q_list3)
        return q_list3, p_list3, l_list
Esempio n. 2
0
    def del_q_adjust(self, q_quantity, q_label, l_list):

        dq = q_quantity - q_label
        # shape [nsamples, nparticle, DIM]

        pbc(dq, l_list)

        return dq
Esempio n. 3
0
def euler(q, p, l):
    dt = 1e-3
    for t in range(100):
        a = q.clone().detach()  # ideal gas
        q = q + dt * p  # move in striaght line
        pbc(q, l)
        p = p + dt * a  # acceleration
    return q, p
Esempio n. 4
0
    def dpair_pbc_sq(self, q, u_list, l_list):  #

        # all list dimensionless
        q_state = torch.unsqueeze(q, dim=2)
        # shape is [nsamples, nparticles, 1, DIM=(x,y)]
        u_list = torch.unsqueeze(u_list, dim=1)

        # shape is [nsamples, 1, nparticles* ngrids, DIM=(x,y)]
        paired_grid_q = u_list - q_state

        # paired_grid_q.shape is [nsamples, nparticles, nparticles * ngrids, DIM]
        pbc(paired_grid_q, l_list)

        dd = torch.sum(paired_grid_q * paired_grid_q, dim=-1)

        # dd.shape is [nsamples, nparticles, nparticles * ngrids]
        return paired_grid_q, dd
    def one_step(self,q_list,p_list,l_list,tau):

        p_list_1 = p_list + 0.5*tau*self.force_function.eval1(q_list,p_list,l_list,tau)

        q_list_1 = q_list + 0.5*tau*self.momentum_function.eval1(q_list,p_list_1,l_list,tau)
        q_list_1.retain_grad()
        q_list_1 = pbc(q_list_1,l_list)

        q_list_2 = q_list_1 + 0.5*tau*self.momentum_function.eval2(q_list_1,p_list_1,l_list,tau)
        q_list_2.retain_grad()
        q_list_2 = pbc(q_list_2,l_list)

        p_list_2 = p_list_1 + 0.5*tau*self.force_function.eval2(q_list_2,p_list_1,l_list,tau)

        assert_nan(p_list_2)
        assert_nan(q_list_2)
        return q_list_2,p_list_2,l_list
Esempio n. 6
0
    def make_grids_center(self,q, l_list,b):
        '''make_grids function to shift 6 grids points at (0,0) to each particle position as center'''
        l_list = torch.unsqueeze(l_list, dim=2)
        # boxsize.shape is [nsamples, nparticle, 1, DIM]
        l_list = l_list.repeat_interleave(self.hex_grids_list(b).shape[0], dim=2)

        q_list = torch.unsqueeze(q, dim=2)
        # q_list.shape is [nsamples, nparticle, 1, DIM=(x coord, y coord)]

        grids_ncenter = self.hex_grids_list(b) + q_list
        # grids_ncenter.shape is [6, 2] + [nsamples, nparticle, 1, DIM] => [nsample, nparticle, 6, DIM=2]

        pbc(grids_ncenter, l_list)  # pbc - for grids
        #self.show_grids_nparticles(q, grids_ncenter,l_list[0,0,0])

        grids_ncenter = grids_ncenter.view(-1, q.shape[1] * self.hex_grids_list(b).shape[0], q.shape[2])
        # shape is [nsamples, nparticle*ngrids, DIM=(x,y)]
        return grids_ncenter
 def one_step(self,q_list,p_list,l_list,tau):
     #f1 = self.force_function.eval1(q_list,p_list,l_list,tau)
     p_list_2 = p_list + 0.5*tau*self.force_function.eval1(q_list,p_list,l_list,tau)
     q_list_2 = q_list + tau*p_list_2
     q_list_2.retain_grad()
     q_list_new = pbc(q_list_2,l_list)
     p_list_new = p_list_2 + 0.5*tau*self.force_function.eval2(q_list_new,p_list_2,l_list,tau)
     #f2 = self.force_function.eval2(q_list_new,p_list_2,l_list,tau)
     assert_nan(p_list_new)
     assert_nan(q_list_new)
     return q_list_new,p_list_new,l_list
    def one_step(self, q_list0, p_list0, l_list):

        p_input0 = self.force_function.prepare_p_input(q_list0, p_list0,
                                                       l_list)
        q_input0 = self.force_function.prepare_q_input(0, q_list0, p_list0,
                                                       l_list)

        p_input_list = [p_input0]
        q_input_list = [q_input0]

        p_list_pre = p_list0
        q_list_pre = q_list0

        for s in range(velocity_verletx.neval):

            p_list_cur = p_list_pre + self.force_function.eval(
                q_input_list, p_input_list)
            p_input_next = self.force_function.prepare_p_input(
                q_list_pre, p_list_cur, l_list)
            p_input_list.append(p_input_next)

            tau = self.force_function.get_tau(2 * s + 1)
            q_list_cur = q_list_pre + tau * p_list_cur + self.force_function.eval(
                q_input_list, p_input_list)
            #q_list_cur = q_list_pre + self.force_function.eval(q_input_list,p_input_list)
            q_list_cur = pbc(q_list_cur, l_list)
            net_idx = s
            q_input_next = self.force_function.prepare_q_input(
                net_idx, q_list_cur, p_list_cur, l_list)
            q_input_list.append(q_input_next)
            p_list_pre = p_list_cur
            q_list_pre = q_list_cur

        assert_nan(p_list_cur)
        assert_nan(q_list_cur)
        return q_list_cur, p_list_cur, l_list