eigensolver_utils.c

来自「MIT开发出来的计算光子晶体的软件」· C语言 代码 · 共 109 行

C
109
字号
/* Copyright (C) 1999, 2000, 2001, 2002, Massachusetts Institute of Technology. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <stdlib.h>#include <stdio.h>#include <math.h>#include "../config.h"#include <mpiglue.h>#include <check.h>#include <scalar.h>#include <matrices.h>#include "eigensolver.h"/**************************************************************************/void eigensolver_get_eigenvals_aux(evectmatrix Y, real *eigenvals,				   evectoperator A, void *Adata,				   evectmatrix Work1, evectmatrix Work2,				   sqmatrix U, sqmatrix Usqrt,				   sqmatrix Uwork){     sqmatrix_sqrt(Usqrt, U, Uwork); /* Usqrt = 1/sqrt(Yt*Y) */     evectmatrix_XeYS(Work1, Y, Usqrt, 1);  /* Work1 = orthornormalize(Y) */     A(Work1, Work2, Adata, 1, Y); /* Work2 = A Work1; Y is scratch */     evectmatrix_XtY(U, Work1, Work2, Uwork);  /* U = Work1 * A * Work1 */     sqmatrix_eigensolve(U, eigenvals, Uwork);     evectmatrix_XeYS(Y, Work1, U, 1);}void eigensolver_get_eigenvals(evectmatrix Y, real *eigenvals,			       evectoperator A, void *Adata,			       evectmatrix Work1, evectmatrix Work2){     sqmatrix U, Usqrt, Uwork;      U = create_sqmatrix(Y.p);     Usqrt = create_sqmatrix(Y.p);     Uwork = create_sqmatrix(Y.p);     evectmatrix_XtX(U, Y, Uwork);     sqmatrix_invert(U, 1, Uwork);     eigensolver_get_eigenvals_aux(Y, eigenvals, A, Adata, Work1, Work2,				   U, Usqrt, Uwork);     destroy_sqmatrix(U);     destroy_sqmatrix(Usqrt);     destroy_sqmatrix(Uwork);}/**************************************************************************//* Subroutines for chaining constraints, to make it easy to pass   multiple constraint functions to the eigensolver: */evectconstraint_chain *evect_add_constraint(evectconstraint_chain *constraints,					    evectconstraint C,					    void *constraint_data){     evectconstraint_chain *new_constraints;     CHK_MALLOC(new_constraints, evectconstraint_chain, 1);     new_constraints->C = C;     new_constraints->constraint_data = constraint_data;     new_constraints->next = constraints;     return new_constraints;}void evect_destroy_constraints(evectconstraint_chain *constraints){     while (constraints) {	  evectconstraint_chain *cur_constraint = constraints;	  constraints = constraints->next;	  free(cur_constraint);     }}void evectconstraint_chain_func(evectmatrix X, void *data){     evectconstraint_chain *constraints = (evectconstraint_chain *) data;     while (constraints) {	  if (constraints->C)	       constraints->C(X, constraints->constraint_data);          constraints = constraints->next;     }}	       

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?