Ejemplo n.º 1
0
    def parallel_penalty_one_iteration_solve(self,N,m,my_list,x0=None,
                                             Lbfgs_options=None,
                                             algorithm='my_lbfgs',scale=False):

        dt=float(self.T)/N
        if x0==None:
            x0 = np.zeros(N+m)
        x = None
        if algorithm=='my_lbfgs':
            x0 = self.Vec(x0)
        Result = []
        rank = self.comm.Get_rank()
        for i in range(len(my_list)):
            
            def J(u):                
                return self.parallel_penalty_functional(u,N,my_list[i])

            def grad_J(u):

                return self.penalty_grad(u,N,m,my_list[i])
            
            
            if algorithm=='my_lbfgs':
                self.update_Lbfgs_options(Lbfgs_options)

                if scale:
                    scaler={'m':m,'factor':self.Lbfgs_options['scale_factor']}
                    
                    solver = Lbfgs(J,grad_J,x0,options=self.Lbfgs_options,
                                   scale=scaler)
                else:
                    solver = Lbfgs(J,grad_J,x0,options=self.Lbfgs_options)
                    
                
                res = solver.one_iteration(self.comm)
                Result.append(res)
                #print res.array(),rank
                #x0 = res['control']
                #print J(x0.array())
                if rank ==0:
                    Result.append(res)
                else:
                    Result.append(0)
            
            return Result
            if len(Result)==1:
                return res
            else:
                return Result