java fock join 列子

本文介绍了如何使用Java的ForkJoinPool并行处理Person对象集合,通过PersonTask类实现了任务的分解与并行执行,显著提高了处理效率。文中详细解释了任务分解、线程池的使用及并行处理的原理。
package com.fock;

public class Person {

	/**
	 * 用户编号
	 */
	private String id;

	/**
	 * 用户名称
	 */
	private String name;
	
	

	public Person(String id) {
		super();
		this.id = id;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + "]"+"\r\n";
	}
	
	

}

package com.fock;

import java.util.List;
import java.util.concurrent.RecursiveAction;

/**
 * 任务分解对象
 * @author djk
 *
 */
public class PersonTask extends RecursiveAction{

	/**
	 * 序列号
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 任务开始位置
	 */
	private int first;

	/**
	 * 任务结束位置
	 */
	private int last;

	/**
	 * 任务处理对象
	 */
	private List<Person> persons;
	
	
	
	public PersonTask(int first, int last, List<Person> persons) {
		super();
		this.first = first;
		this.last = last;
		this.persons = persons;
	}



	@Override
	protected void compute() {
        if (last - first < 10) {
        	System.out.println("============begin================");
            for (int i = first; i < last; i++) {
                Person person = persons.get(i);
                person.setName("djk");
                System.out.println(person);
            }
            System.out.println("============end================");
        } else {
			int middle = (last + first) / 2;
			PersonTask left = new PersonTask(first, middle, persons);
			PersonTask right = new PersonTask(middle, last, persons);
            invokeAll(left, right);
        }
		
	}

}

package com.fock;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;

public class FockJoinTest {
	public static void main(String[] args) {
		List<Person> list = getEmptyPerson();
		// 设置用户的名称
		ForkJoinPool fjpool = new ForkJoinPool();
		fjpool.execute(new PersonTask(0, list.size(), list));
		fjpool.shutdown();
		// 最多等待5秒
		try {
			fjpool.awaitTermination(5, TimeUnit.SECONDS);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(list);
	}

	/**
	 * 获得空的对象
	 * 
	 * @return
	 */
	private static List<Person> getEmptyPerson() {
		List<Person> list = new ArrayList<Person>();
		for (int i = 0; i < 25; i++) {
			list.add(new Person(i+""));
		}
		return list;
	}
}

Hartree - Fock(HF)方法是量子化学中的重要方法。在量子化学领域,有关于其理论和计算流程的相关介绍。 有文章以《Modern Quantum Chemistry: Introduction to Advanced Electronic Structure Theory》中关于Hartree - Fock的部分(146 ~ 164页)为基础,介绍了自洽场计算的流程,旨在帮助读者理解,且用Python语言进行演示,为初学量子化学的新人提供帮助 [^1]。 在电子结构相关知识里,涉及到Hartree - Fock方程的导出、解的意义等内容。例如Hartree - Fock方程可表示为 \(h(1)\chi_a(1)+\sum\limits_{b\neq a}\left[\int d\textbf{x}_2|\chi_b(2)|^2r_{12}^{-1}\right]\chi_a(1)-\sum\limits_{b\neq a}\left[\int d\textbf{x}_2\chi_b^*(2)\chi_a(2)r_{12}^{-1}\right]\chi_b(1)=\varepsilon_a\chi_a(1)\) ,还包含Roothaan方程(限制的闭壳层HF)、实例(如H₂和HeH⁺ )、多原子基组、闭壳层计算实例等内容 [^2]。 在计算方面,用Python编写量化计算程序求解简单限制性Hartree - Fock方程时,会涉及到计算G的步骤,如在求解H₂的相关计算中,有计算G的函数 `calc_G_H2` ,其依据Szabo著作中pp141(3.154)的公式进行计算 [^3]。 另外,Hartree - Fock理论中体系能量 \(E\) 可表示为 \(\large E=\sum\limits_i \varepsilon_i-\frac{1}{2}\sum\limits_{i\neq j}\iint\frac{|\psi_i|^2|\psi_j|^2}{r_{ij}}d\textbf{r}_i d\textbf{r}_j\) ,还涉及到SCF开壳层与闭壳层、对称性等内容 [^4]。 ### 代码示例 以下是引用中关于计算G的Python代码示例: ```python import numpy as np # 假设eri_table是一个已经定义好的函数,用于计算两电子积分 def eri_table(u, v, p, q): # 这里只是占位,实际需要实现具体的积分计算 return 1 def calc_G_H2(D): # Szabo., pp141(3.154) G = np.zeros(D.shape) dim = D.shape[0] for u in range(dim): for v in range(dim): temp = 0. for p in range(dim): for q in range(dim): # eri_table(u,v,p,q) 是两电子积分(uv|pq) doubleJ = eri_table(u, v, p, q) K = 0.5 * eri_table(u, q, p, v) # +=返回值给符号左侧的变量 # 两电子积分相减为2J - K temp += D[p, q] * (doubleJ - K) G[u, v] = temp return G ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值