当前位置:文档之家› JADE中文教程及笔记

JADE中文教程及笔记

JADE中文教程及笔记
JADE中文教程及笔记

JADE架构模型:

JADE是多agent开发框架,遵循fipa规范,他提供了基本的命名服务,黄业服务,通讯机制等,可以有效地与其它java开发平台和技术集成。

JADE架构适应性很强,不仅可以在受限资源环境中运行,而且与其他复杂架构集成到一起比如。Net和javaEE。

JADE功能模型:

Jade提供了在固定和移动环境中实施分布式点对点应用的基本服务。

允许agent动态的发现其他agent以及与其他agent通讯。Agent通过异步消息进行通讯,这种通讯机制可以在分布和松散耦合的环境中是通用的。Agents可以在异构环境中通信,通过名字来区分(以后的版本中发送方和接收方没有暂时的依赖关系)。

通过认证和为agents分配权限实现安全机制。

消息结构使用ACL语言。为了适应复杂对话,jade提供了一系列执行特定人物的交互性为的典型框架,比如协商,拍卖,任务代理等(用java抽象类来实现)。消息内容可以在xml和rdf格式间互相转换。

灵活性强,用java线程实现多任务。

提供命名服务和黄页服务。

支持图形化调试和管理/监控工具。

第一次运行jade3.4,

并成功执行一个最简单的helloworld。使用步骤记录如下:平台为window2003。jdk版本为1.5。假设现在jdk已经安装并且配置成功。

1.下载jade,下载站点为https://www.doczj.com/doc/cc4986713.html,/。假设下载文件为JADE-all-3[1].4.zip 2.将文件解压,解压后,平台必须运行的bin目录下的文件我们都放在在d:\jade\下。当前目录结构为D:\jade\lib

\demo

\lisence

\changelog

\README

设置环境变量在CLASSPA TH中添加

D:\jade\lib\jade.jar;D:\jade\lib\iiop.jar;D:\jade\lib\commons-codec\commons-codec-1.3.jar;D:\jade \lib\javaTools.jar;D:\jade\lib\http.jar

Old :

E:\jade\lib\Base64.jar;E:\jade\lib\jade.jar;E:\jade\lib\jadeTools.jar;E:\jade\lib\http.jar;E:\jade \lib\iiop.jar;.;D:\Borland\JBuilder2005\jdk1.4\lib\dt.jar;D:\Borland\JBuilder2005\jdk1.4\lib\tools.j ar;

3.测试主容器运行是否正常,在命令行下输入命令

java jade.Boot -gui

如果设置无误,会弹出jade rma主容器运行界面。关掉程序

4.写一个helloworld程序,这个程序当然可以用任何一个文本编辑器来写,然后用命令编译,我们为了今后开发方便,将jade平台与netbeans平台绑定起来。运行netbeans平台,添加库,添加库的步骤如下运行菜单工具--〉库管理器,点新建库,然后输入库名,不妨设为jade,然后点添加jar文件,将classpath中的几个jar文件都添加进来。

5.在netbeans中新建一个常规项目(选择java类,注意不创建主文件!!!把那个复选框去

掉!!!),然后创建一个包(假设为jadetest),在该包下创建一个HelloWorld.java文件。文件内的程序内容如下:

import jade.core.*;

public class HelloWorld extends Agent{

public void setup(){

System.out.println("Agent Started: Hello World!");

System.out.println("-----About Me:-----");

System.out.println("My local name is:"+getLocalName());

System.out.println("My globally unique name is:"+getName() );

System.out.println("-----About Here:-----");

Location l = here();

System.out.println("I am running in a location called:"+l.getName());

System.out.println("Which is identified uniquely as:"+l.getID());

System.out.println("And is contactable at:"+l.getAddress());

System.out.println("Using the protocol:"+l.getProtocol());

}

}//这个例子只有一个主体启动执行程序

这时有错误提示,说明jade.core库并未找到,需要在工程窗口中,单击库的右键,将我们前面加入的jade库添加近来。

然后设置运行命令,打开工程属性窗口,单击运行,在主类编辑框中输入jade.Boot,在运行参数编辑框中输入-gui hello:jadetest.HelloWorld。确定返回

这时直接点netbeans工具条上的运行按钮,程序运行,会弹出jade rma运行窗口,并在netbeans下面的输出框中打印出结果信息。

如果运行到这一步,则一切ok了

输出结果为:

Agent Started: Hello World!

-----About Me:-----

My local name is:hello

My globally unique name is:hello@haha:1099/JADE

-----About Here:-----

I am running in a location called:Main-Container

Which is identified uniquely as:Main-Container@haha

And is contactable at:haha

Using the protocol:rmi

补充:在eclipse中进行配置与netbeans稍有不同。不过步骤一样,首先要在eclipse中添加库。

在窗口-首选项中,选择java,展开其子项,在构建路径—〉用户库中,新建一个库,名称不妨定为jade,然后,添加jar,将我们前面所列出的jar文件都导入。第二步就是在新建的工程中添加库和设置运行参数。比如新建了一个项目,在导航器中右键单击其属性,在属性对话框中选择java构建路径,在“库”选项卡中单击按钮,添加库,选择用户库,然后下一步把jade添加进来。设置运行参数的时候,可以按如下步骤进行:选择编写好的agent 类,右键单击,运行方式—〉运行,弹出运行对话框,在java application中选择新建,不妨起名为run in jade,设置main类为jade.Boot,在自变量中输入参数:在上例中则为,-gui hello:jadetest.HelloWorldAgent。然后运行之,则会在工作区下面的控制台上输出结果,表示配置成功。

另:其实在项目中不一定非要完全运行,而且我们一般要创建的是多个Agent。一般我们也可以把它编译为类之后,使用命令行启动图形界面的管理器,

使用start new agent添加Agent即可。

Jade行为类

在前面的例子中,agent所作的工作都定义在了setup中,实际上它具有的行为和执行的动作都应该定义在behavious类中,我们可以对生成behavios类的实例,然后将任务或者动作代码放在对behavious类中的action方法中,action方法是必须要有的。Behavious类还有很多子类,分别对应着不同类型的behavious,包括SimpleBehaviour, sequences behaviors , parallel behaviors, cyclic behaviors等。

一个agent的行为表示它能够执行的任务,通过继承jade.core.behaviours.Behaviour来实现。然后在agent类中通过addBehaviour()方法将行为加入进来。当一个agent启动(通过setup()方法)后,行为可以在任何时间加入进来。

要定义Behaviour必须实现其action()方法,它定义了agent的执行时的实际动作,而done()方法指名了一个行为是否已执行完毕,是否要从行为池中删除。

一个agent可以并发执行多个behaviour。每个agent线程启动后执行的过程如下:

1.SimpleBehaviour简单行为

下面的例子中我们不在setup()中打印信息,而是把它放在一个简单行为中:

在jadetest包里面新建一个java类命名为SimpleBehaviour,输入下面代码。要想使得项目能在不同类之间交换执行(即执行完HelloWorld之后再测试SimpleBehaviour)就得点击“生成”菜单中的“停止生成/运行”菜单项。除了上面修改之外,还要把项目属性中的参数改为“-gui sb:jadetest.SimpleBehaviour”.

import jade.core.*;

import jade.core.behaviours.SimpleBehaviour;

public class HelloWorldBehaviours extends Agent{

public void setup(){

SimpleBehaviour hello_behaviour = new SimpleBehaviour(this){

boolean finished = false;

// 覆盖Behaviour 类的action这一抽象方法

public void action(){

System.out.println("Hello World Behaviour run: Hello World!");

System.out.println("-----About Me:-----");

System.out.println("My local name is:"+getLocalName());

System.out.println("My globally unique name is:"+getName() );

System.out.println("-----About Here:-----");

Location l = here();

System.out.println("I am running in a location called:"+l.getName());

System.out.println("Which is identified uniquely as:"+l.getID());

System.out.println("And is contactable at:"+l.getAddress());

System.out.println("Using the protocol:"+l.getProtocol());

finished = true; }

// done()在父类中也是一个抽象方法

public boolean done(){

return finished;}

};

addBehaviour(hello_behaviour);} //setup()

}// java jade.Boot helloBehaviours:HelloWorldBehaviours

上面程序调试是老是提示说SimpleBehaviour已经存在了的错误。只要做如下修改即可运行import jade.core.behaviours.Behaviour;

Behaviour hello_behaviour = new Behaviour(this){

输出结果为:

Hello World Behaviour run: Hello World!

-----About Me:-----

My local name is:SBV

My globally unique name is:SBV@haha:1099/JADE

-----About Here:-----

I am running in a location called:Main-Container

Which is identified uniquely as:Main-Container@haha

And is contactable at:haha

Using the protocol:rmi

这个程序相较于前面的例子多了action, done两个函数,它们分别执行自己的操作。HelloWorldBehaviours类加载时定义一个简单行为,这个简单行为执行的操作由action,done来实现。然后,再通过加载语句(addBehaviour(hello_behaviour))执行这个简单行为。

2.简单行为和循环行为(CyclicBehaviour)组合的例子

一个Agent中可以加入各种Behaviour构成composite behaviour。

在netbeans工程中编写下列程序,过程如前所描述。

package examplesbehaviours;

import jade.core.Agent;

import jade.core.behaviours.Behaviour;

import jade.core.behaviours.CyclicBehaviour;

import jade.core.behaviours.OneShotBehaviour;

public class SimpleAgent extends Agent {

private class FourStepBehaviour extends Behaviour {

//SimpleBehaviour hello_behaviour = new SimpleBehaviour(this){ 这两条语句有很大不同吗?上面的定义一个新的类,下面的修改了标准行为的执行内容

private int step = 1;

public void action() {

switch (step) {

case 1:

System.out.println("Operation 1");

break;

case 2:

System.out.println("Operation 2. Adding one-shot behaviour");

myAgent.addBehaviour(new OneShotBehaviour(myAgent) {

//增加了一个新的动作,即快照

public void action() {

System.out.println("One-shot");

}

});// myAgent.addbehaviour

break;

case 3:

System.out.println("Operation 3");

break;

case 4:

System.out.println("Operation 4");

break;

}//switch

step++;

} //action

public boolean done() {

return step = = 5; //判断语句

}

public int onEnd() {

myAgent.doDelete();

System.out.println("Finished!");

return super.onEnd(); }

} // class FourStepBehaviour

/** Creates a new instance of SimpleAgent */

protected void setup() {

System.out.println("Agent "+getLocalName()+" started.");

addBehaviour(new CyclicBehaviour(this) { //增加了一个循环行为

public void action() {

System.out.println("Cycling");}

}); // //增加的循环行为

// Add the generic behaviour

addBehaviour(new FourStepBehaviour());

}////setup()

}//

运行参数为jade.Boot –gui guojie: examplesbehaviours.SimpleAgent

输出结果:Agent guojie started.

Cycling

Operation 1

Cycling

Operation 2. Adding one-shot behaviour

Cycling

Operation 3

One-shot

Cycling

Operation 4

Finished!

注意每个Agent内部都有一个parallel behaviour,我们如果加入多个behaviour到Agent 中,他们会并行执行。Behaviours加入到队列的顺序就是他们执行的次序。最后,behaviours 可以动态的加入到agent以及composite behaviours。

总结:每个主体的执行都是从setup() 开始顺序执行的。主体可以执行自定义的行为,如上例中的hello_behaviour ,FourStepBehaviour,也可以执行标准化的行为如OneShotBehaviour,

agent通讯:ACL(agent communication language)

Jade的agent之间进行通信使用的acl语言遵循fipa acl规范。一个acl消息通常包含这些参数:sende:消息的发送者,用agent标志AID表示;receivers,接受agent消息的agent 可以是多个;Reply-to,应受到回应的接受者;Performative:标志发送消息的目的,即发送者想要通过发送消息干什么,通常有这样一些常值:REQUEST, INFORM, ACCEPT_PROPOSAL, REJECT_PROPOSAL, PROPOSE;Content,消息的内容;内容语言,比如内容的编码格式;ontology,双方都能够理解的消息内容的概念说明和语义描述。

简单实例

发送者:

import java.io.InterruptedIOException;

import java.io.IOException;

import jade.core.*;

import jade.core.behaviours.*;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.*;

public class SimpleSender extends Agent {

protected void setup() {

addBehaviour(new Behaviour(this) {

private boolean finished = false;

public void action() {

System.out.println(getLocalName() +": about to inform bob hello");

//we sleep here to give bob a chance to start.

doWait(5000);

AID r = new AID();//作用是什么?

r.setLocalName("bob");

ACLMessage msg = new ACLMessage(https://www.doczj.com/doc/cc4986713.html,RM);

// set performative

msg.setSender(getAID());

msg.addReceiver(r);

msg.setContent("Hello_BOB");

send(msg);

System.out.println(getLocalName() +": Send hello to bob");

System.out.println("the content is:" + msg.getContent()); //finished = true;

doWait(5000);

doDelete(); } //action

public boolean done(){

return finished;}

}); //addbehavior

}//setup

}//agent

这段代码的主要执行过程为:构建一个AID,以此来指出该消息的目的Agent。这里我们指定目的为一个本地的Agent,名字为bob。建立一个ACL消息标志其performative为INFORM。设定Sender为自身,指定接收者为bob。然后发送消息内容。打印相关信息。接收者:他的名字必须为bob

import jade.core.*;

import jade.core.behaviours.*;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.ACLMessage;

public class SimpleReceiver extends Agent {

class DoSimpleReceiveBehaviour extends SimpleBehaviour {

private boolean finished = false;

public DoSimpleReceiveBehaviour(Agent agent){

super(agent);}

public void action() {

ACLMessage msg = receive();

if (msg!= null){

System.out.println(getLocalName() + ": received the following message : ");

System.out.println(msg.toString());

finished = true;

myAgent.doDelete();}

else{

System.out.println(getLocalName() + ":No message received, Blocking the behaviour till one is");

block();}

}//action

public boolean done() {

return finished;}

}//DoSimpleReceiveBehaviour

protected void setup() {

DoSimpleReceiveBehaviour behaviour = new DoSimpleReceiveBehaviour(this);

addBehaviour(behaviour);}

}//agent

接收者的代码流程为:添加一个简单行为,这一行为检查现在是否有受到消息,若没有,则执行block()方法组织目前的behaviour执行,直到有新的消息到达。

复杂实例

FIPA定义了一组交互协议,包括FIPA-request, FIPA-query, FIPA-request-when, FIPA-contract-net, FIPA-Iterater-net, FIPA-Auction-English, FIPA-Auction-Dutch.其中:REQUEST-INFORM:A请求B做一些工作,B可以同意或拒绝。如果B同意,则会去完成并告诉A该工作已经完成。等等。

Query:A想知道一些事情,B可以同意或不同意,并将B的回应告诉A。

Propose:在给定一些precondition的条件下,提出一个proposal去执行某些动作。

在netbeans中创建常规项目:其代码文件有两个,分别为

package ips;

import java.io.InterruptedIOException;

import java.io.IOException;

import jade.core.*;

import jade.core.behaviours.*;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.*;

import jade.domain.FIPANames.InteractionProtocol;

import jade.proto.SimpleAchieveREInitiator;

import java.util.Vector;

import java.util.Enumeration;

public class SimpleRequestInitiator extends Agent{

static class MarriageProposer extends SimpleAchieveREInitiator{

protected MarriageProposer(Agent agent, ACLMessage msg){

super(agent, msg);

}

protected void handleAgree(ACLMessage msg) {

System.out.println(myAgent.getLocalName() + ": 吼吼! " +

msg.getSender().getLocalName() +" 已经同意嫁给我了, I'm so excited!");

}

protected void handleRefuse(ACLMessage msg) {

System.out.println(myAgent.getLocalName() + ": Oh no! " +

msg.getSender().getLocalName() +" 拒绝了我, i feel sad.");

}

protected void handleInform(ACLMessage msg) {

System.out.println(myAgent.getLocalName() + ":" +

msg.getSender().getLocalName() +" has informed me of the status of my request." +

" They said : " + msg.getContent());

}

protected void handleNotUnderstood(ACLMessage msg){

System.out.println(myAgent.getLocalName() + ":"

+ msg.getSender().getLocalName() +

" has indicated that they didn't understand.");

}

protected void handleOutOfSequence(ACLMessage msg) {

System.out.println(myAgent.getLocalName() + ":"

+ msg.getSender().getLocalName() +

"has sent me a message which I wasn't" +

" expecting in this conversation");

}

}

protected void setup() {

System.out.println(getLocalName() +": about to propose marriage to bob ");

doWait(5000); //wait for bob to be started.

ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);

AID to = new AID();

to.setLocalName("bob");

msg.setSender(getAID());

msg.addReceiver(to);

msg.setContent("Marry Me!");

msg.setProtocol(InteractionProtocol.FIPA_REQUEST);

addBehaviour(new MarriageProposer(this, msg));

}

}

还有:

package ips;

import java.io.InterruptedIOException;

import java.io.IOException;

import jade.core.*;

import jade.core.behaviours.*;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.*;

import jade.domain.FIPANames.InteractionProtocol;

import jade.proto.SimpleAchieveREResponder;

import java.util.Vector;

import java.util.Enumeration;

public class SimpleRequestResponder extends Agent {

static class MarriageResponder extends SimpleAchieveREResponder{

public MarriageResponder(Agent agent){

super(agent,createMessageTemplate(InteractionProtocol.FIPA_REQUEST));

}

protected ACLMessage prepareResponse(ACLMessage msg) {

ACLMessage response = msg.createReply();

if(msg.getContent()!=null && msg.getContent().equals("Marry Me!")){

System.out.println(myAgent.getLocalName() + ":" +

msg.getSender().getLocalName() +

" has asked me to marry him!");

AID sender;

sender = msg.getSender();

if(sender.getLocalName().equals("baz")){

response.setPerformative(ACLMessage.AGREE);

System.out.println(myAgent.getLocalName() +

":I'm going to agree.");

}else{

response.setPerformative(ACLMessage.REFUSE);

System.out.println(myAgent.getLocalName() +

":I'm going to turn him down.");

}

}else{

response.setPerformative(ACLMessage.NOT_UNDERSTOOD);

System.out.println(myAgent.getLocalName() +

":I didn't understand what " +

msg.getSender().getLocalName() +

" just said to me.");

}

return response;

}

protected ACLMessage prepareResultNotification(ACLMessage inmsg, ACLMessage outmsg) {

//what they have asked is now complete (or if it failed)

ACLMessage msg = inmsg.createReply();

msg.setPerformative(https://www.doczj.com/doc/cc4986713.html,RM);

msg.setContent("I Do!");

return msg;

}

}

protected void setup() {

System.out.println(getLocalName() +

": I wonder if anybody wants to marry me?");

addBehaviour(new MarriageResponder(this));

}//

}

按照以前记载,在netbeans属性中加入库,然后再运行参数中,设置,主类依然为jade.Boot,参数为baz:ips.SimpleRequestInitiator bob:ips.SimpleRequestResponder,运行成功后,以下是输出结果:

baz: about to propose marriage to bob

bob: I wonder if anybody wants to marry me?

bob:baz has asked me to marry him!

bob:I'm going to agree.

baz: 吼吼! bob 已经同意嫁给我了, I'm so excited!

baz:bob has informed me of the status of my request. They said : I Do!

上例中,应用了SimpleAchieveREInitiator和SimpleAchieveREResponder两个基类,适用于两个Agent之间的交互。可以看出发起者对于不同的回应有不同的执行动作。

技巧:从AMS中获取所有Agent的AID。

引用文件:

import jade.domain.AMSService;

import jade.domain.FIPAAgentManagement.*;

调用示例:AMSAgentDescription [] agents = null;

try {

SearchConstraints c = new SearchConstraints();

c.setMaxResults (new Long(-1));

agents = AMSService.search( this, new AMSAgentDescription (), c );

}

catch (Exception e) {

System.out.println( "Problem searching AMS: " + e );

e.printStackTrace();

}

ACLMessage msg = new ACLMessage(https://www.doczj.com/doc/cc4986713.html,RM);

msg.setContent( "Ping" );

for (int i=0; i

if ( agents[i].getName().equals(getAID()) ){

//如果不是自己则加入到接收者数组中

continue;

}

msg.addReceiver( agents[i].getName() );

}

3.ACL高级特性之消息模板:

MessageTemplate class 利用MessageTemplate可以针对ACLMessage的每个属性设置模式,以达到过滤消息的目的。为了可以构建更复杂的匹配规则,多个模式也可以进行and,or,not运算。最有用的一些规则或方法包括:通信行为匹配,发送者匹配,会话ID 匹配。

比如MatchPerformative( performative ) 是通信行为的匹配。

这里performative 可能是:

https://www.doczj.com/doc/cc4986713.html,RM

ACLMessage.PROPOSE

ACLMessage.AGREE

还有发送者匹配MatchSender( AID ),会话匹配MatchConversationID( String ),通信协议匹配MatchProtocol( String ) ,本体匹配MatchOntology( String)。

比如:MessageTemplate mt = MessageTemplate.and(

MessageTemplate.Match Performative( https://www.doczj.com/doc/cc4986713.html,RM ),

MessageTemplate.Match Sender( new AID( "a1", AID.ISLOCALNAME))) ;

相当于建立了一个模板,表示消息规则为INFORM行为并且发送者为“a1”。

接收过程如下:ACLMessage msg = receive( mt );

if (msg != null) { ... handle message }

block();

示例:package jadePrime.acl;

import jade.core.Agent;

import jade.core.AID;

import jade.core.behaviours.*;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.*;

public class Template extends Agent {

MessageTemplate mt1 = MessageTemplate.and(

MessageTemplate.MatchPerformative( https://www.doczj.com/doc/cc4986713.html,RM ),

MessageTemplate.MatchSender( new AID( "a1",AID.ISLOCALNAME))) ;

protected void setup()

{

// Send messages to "a1" and "a2"

ACLMessage msg = new ACLMessage(https://www.doczj.com/doc/cc4986713.html,RM);

msg.setContent( "Ping" );

for (int i = 1; i<=2; i++)

msg.addReceiver( new AID( "a" + i, AID.ISLOCALNAME) );

send(msg);

// Set-up Behaviour 1

addBehaviour(new CyclicBehaviour(this)

{

public void action( )

{

System.out.print("Behaviour ONE: ");

ACLMessage msg= receive( mt1 );

if (msg!=null

System.out.println( "gets " + msg.getPerformative() + " from "+ msg.getSender().getLocalName() + "=" + msg.getContent() );

else

System.out.println( "gets NULL" );

block();

}

});

// Set-up Behaviour 2

addBehaviour(new CyclicBehaviour(this)

{

public void action()

{

System.out.print("Behaviour TWO: ");

ACLMessage msg= receive();

if (msg!=null)

System.out.println( "gets "

+ msg.getPerformative() + " from "

+ msg.getSender().getLocalName() + "="

+ msg.getContent() );

else

System.out.println( "gets NULL" );

block();

}

});

}

}

package jadePrime.acl;

import jade.core.Agent;

import jade.core.behaviours.*;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.*;

public class Responder extends Agent {

protected void setup()

{

addBehaviour(new CyclicBehaviour(this)

{

public void action()

{

ACLMessage msg = receive();

if (msg!=null) {

ACLMessage reply = msg.createReply();

reply.setPerformative( https://www.doczj.com/doc/cc4986713.html,RM );

reply.setContent(" Gossip....." );

send(reply);

reply.setPerformative( ACLMessage.PROPOSE );

reply.setContent(" Really sexy stuff... cheap! " );

send(reply);

}

block();

}

});

}

}

输出结果:

4.Base64:发送消息为java序列化对象

在JADE中,支持agents之间通信的消息内容使用序列化的java对象,对本地应用,特别是所有agent都用java实现的情况下也是很有用的.

看实例:一个ObjectSender负责发送一个Person对象,ObjectReceiver负责接收后打印出接收到的内容。

源文件:Person.java

package examples.Base64;

import java.io.*;

import java.util.Date;

public class Person implements Serializable {

String name;

String surname;

Date birthdate;

int age;

Person(String n, String s, Date d, int a) {

name = n;

surname = s;

birthdate = d;

age = a;

}

public String toString() {

return(name+ " "+ surname +" born on "+birthdate.toString()+" age = "+age);

}

}

文件2:ObjectSender.java

package examples.Base64;

import java.io.IOException;

import java.util.Date;

import jade.core.*;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.ACLMessage;

public class ObjectSender extends Agent {

protected void setup()

{

try{

ACLMessage msg = new ACLMessage(https://www.doczj.com/doc/cc4986713.html,RM);

msg.setContent( "Ping" );

AID personR = new AID( "personR", AID.ISLOCALNAME );

msg.addReceiver(personR );

Person p = new Person("Name1", "Surname1", new Date(), 1);

msg.setContentObject(p);

msg.setLanguage("JavaSerialization");

send(msg);

System.out.println(getLocalName()+" sent 1st msg "+msg);

send(msg);

}

catch (IOException e ) {

e.printStackTrace();

}

doDelete(); // kill itself because it has completed its task.

}

}

文件三:ObjectReceiver.java

package examples.Base64;

import jade.core.*;

import jade.core.behaviours.CyclicBehaviour;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.ACLMessage;

import https://www.doczj.com/doc/cc4986713.html,ng.acl.UnreadableException;

public class ObjectReceiver extends Agent {

protected void setup() {

addBehaviour(new CyclicBehaviour(this)

{

public void action() {

try{

ACLMessage msg = blockingReceive();

System.out.println(getLocalName()+ " rx msg"+msg);

if ("JavaSerialization".equals(msg.getLanguage())) {

Person p = (Person)msg.getContentObject();

System.out.println(getLocalName()+ " 获取Java对象: ");

System.out.println(p.getClass().getName());

System.out.println(p.toString());

}

}

catch(UnreadableException e3){

System.err.println(getLocalName()+ " catched exception

"+e3.getMessage());

}

block();

}

});

}

}

外部应用程序调用Agent

JADE2.3以后的版本都提供了in-process接口来实现外部应用程序对agent的调用。

我们可以通过jade.core.Runtime.instance()来获得jade运行时的一个单独得实例。有两种方法可以用来创建一个jade主容器和一个jade远程容器。主要调用过程如下:

先看简单的例子:

package inprocess;

import jade.core.*;

import jade.core.behaviours.*;

/**

*

* @author Administrator

*/

public class CustomAgent extends Agent{

FLUENT中文全教程1-250

FLUENT 教程 赵玉新 I、目录 第一章、开始 第二章、操作界面 第三章、文件的读写 第四章、单位系统 第五章、读入和操作网格 第六章、边界条件 第七章、物理特性 第八章、基本物理模型 第九章、湍流模型 第十章、辐射模型 第十一章、化学输运与反应流 第十二章、污染形成模型 第十三章、相变模拟 第十四章、多相流模型 第十五章、动坐标系下的流动 第十六章、解算器的使用 第十七章、网格适应 第十八章、数据显示与报告界面的产生 第十九章、图形与可视化 第二十章、Alphanumeric Reporting 第二十一章、流场函数定义 第二十二章、并行处理 第二十三章、自定义函数 第二十四章、参考向导 第二十五章、索引(Bibliography) 第二十六章、命令索引 II、如何使用该教程 概述 本教程主要介绍了FLUENT 的使用,其中附带了相关的算例,从而能够使每一位使用 者在学习的同时积累相关的经验。本教程大致分以下四个部分:第一部分包括介绍信息、用户界面信息、文件输入输出、单位系统、网格、边界条件以及物理特性。第二和第三部分包含物理模型,解以及网格适应的信息。第四部分包括界面的生成、后处理、图形报告、并行处理、自定义函数以及FLUENT 所使用的流场函数与变量的定义。 下面是各章的简略概括 第一部分: z开始使用:本章描述了FLUENT 的计算能力以及它与其它程序的接口。介绍了如何对具体的应用选择适当的解形式,并且概述了问题解决的大致步骤。在本章中,我们给出

了一个可以在你自己计算机上运行的简单的算例。 z使用界面:本章描述了用户界面、文本界面以及在线帮助的使用方法。同时也提供了远程处理与批处理的一些方法。(请参考关于特定的文本界面命令的在线帮助) z读写文件:本章描述了FLUENT 可以读写的文件以及硬拷贝文件。 z单位系统:本章描述了如何使用FLUENT 所提供的标准与自定义单位系统。 z读和操纵网格:本章描述了各种各样的计算网格来源,并解释了如何获取关于网格的诊断信息,以及通过尺度化(scale)、分区(partition)等方法对网格的修改。本章还描述了非一致(nonconformal)网格的使用. z边界条件:本章描述了FLUENT 所提供的各种类型边界条件,如何使用它们,如何定义它们and how to define boundary profiles and volumetric sources. z物理特性:本章描述了如何定义流体的物理特性与方程。FLUENT 采用这些信息来处理你的输入信息。 第二部分: z基本物理模型:本章描述了FLUENT 计算流体流动和热传导所使用的物理模型(包括自然对流、周期流、热传导、swirling、旋转流、可压流、无粘流以及时间相关流)。以及在使用这些模型时你需要输入的数据,本章也包含了自定义标量的信息。 z湍流模型:本章描述了FLUENT 的湍流模型以及使用条件。 z辐射模型:本章描述了FLUENT 的热辐射模型以及使用条件。 z化学组分输运和反应流:本章描述了化学组分输运和反应流的模型及其使用方法。本章详细的叙述了prePDF 的使用方法。 z污染形成模型:本章描述了NOx 和烟尘的形成的模型,以及这些模型的使用方法。 第三部分: z相变模拟:本章描述了FLUENT 的相变模型及其使用方法。 z离散相变模型:本章描述了FLUENT 的离散相变模型及其使用方法。 z多相流模型:本章描述了FLUENT 的多相流模型及其使用方法。 z Flows in Moving Zones(移动坐标系下的流动):本章描述了FLUENT 中单一旋转坐标系,多重移动坐标系,以及滑动网格的使用方法。 z Solver 的使用:本章描述了如何使用FLUENT 的解法器(solver)。 z网格适应:本章描述了explains the solution-adaptive mesh refinement feature in FLUENT and how to use it 第四部分: z显示和报告数据界面的创建:本章描述了explains how to create surfaces in the domain on which you can examine FLUENT solution data z图形和可视化:本章描述了检验FLUENT 解的图形工具 z Alphanumeric Reporting:本章描述了如何获取流动、力、表面积分以及其它解的数据。 z流场函数的定义:本章描述了如何定义FLUENT 面板内出现的变量选择下拉菜单中的流动变量,并且告诉我们如何创建自己的自定义流场函数。 z并行处理:本章描述了FLUENT 的并行处理特点以及使用方法 z自定义函数:本章描述了如何通过用户定义边界条件,物理性质函数来形成自己的FLUENT 软件。 如何使用该手册 z根据你对CFD 以及FLUENT 公司的熟悉,你可以通过各种途径使用该手册 对于初学者,建议如下:

js模版引擎handlebars

js模版引擎handlebars.js实用教程——each嵌套 1 2 3 4 5each嵌套 - by 杨元 6 7 8

each嵌套

9 10
11 12 13 14 15 16 17 18 19 26 27

28 55 56

(完整版)《FLUENT中文手册(简化版)》

FLUENT中文手册(简化版) 本手册介绍FLUENT的使用方法,并附带了相关的算例。下面是本教程各部分各章节的简略概括。 第一部分: ?开始使用:描述了FLUENT的计算能力以及它与其它程序的接口。介绍了如何对具体的应用选择适当的解形式,并且概述了问题解决的大致步骤。在本章中给出了一个简单的算例。 ?使用界面:描述用户界面、文本界面以及在线帮助的使用方法,还有远程处理与批处理的一些方法。?读写文件:描述了FLUENT可以读写的文件以及硬拷贝文件。 ?单位系统:描述了如何使用FLUENT所提供的标准与自定义单位系统。 ?使用网格:描述了各种计算网格来源,并解释了如何获取关于网格的诊断信息,以及通过尺度化(scale)、分区(partition)等方法对网格的修改。还描述了非一致(nonconformal)网格的使用. ?边界条件:描述了FLUENT所提供的各种类型边界条件和源项,如何使用它们,如何定义它们等 ?物理特性:描述了如何定义流体的物理特性与方程。FLUENT采用这些信息来处理你的输入信息。 第二部分: ?基本物理模型:描述了计算流动和传热所用的物理模型(包括自然对流、周期流、热传导、swirling、旋转流、可压流、无粘流以及时间相关流)及其使用方法,还有自定义标量的信息。 ?湍流模型:描述了FLUENT的湍流模型以及使用条件。 ?辐射模型:描述了FLUENT的热辐射模型以及使用条件。 ?化学组分输运和反应流:描述了化学组分输运和反应流的模型及其使用方法,并详细叙述了prePDF 的使用方法。 ?污染形成模型:描述了NOx和烟尘的形成的模型,以及这些模型的使用方法。 第三部分: ?相变模拟:描述了FLUENT的相变模型及其使用方法。 ?离散相变模型:描述了FLUENT的离散相变模型及其使用方法。 ?多相流模型:描述了FLUENT的多相流模型及其使用方法。 ?移动坐标系下的流动:描述单一旋转坐标系、多重移动坐标系、以及滑动网格的使用方法。 ?解法器(solver)的使用:描述了如何使用FLUENT的解法器。 ?网格适应:描述了如何优化网格以适应计算需求。 第四部分: ?显示和报告数据界面的创建:本章描述了explains how to create surfaces in the domain on which you can examine FLUENT solution data ?图形和可视化:本章描述了检验FLUENT解的图形工具 ?Alphanumeric Reporting:本章描述了如何获取流动、力、表面积分以及其它解的数据。 ?流场函数的定义:本章描述了如何定义FLUENT面板内出现的变量选择下拉菜单中的流动变量,并且告诉我们如何创建自己的自定义流场函数。 ?并行处理:本章描述了FLUENT的并行处理特点以及使用方法 ?自定义函数:本章描述了如何通过用户定义边界条件,物理性质函数来形成自己的FLUENT软件。 如何使用该手册 对于初学者,建议从阅读“开始”这一章起步。 对于有经验的使用者,有三种不同的方法供你使用该手册:按照特定程序的步骤从按程序顺序排列的目录列表和主题列表中查找相关资料;从命令索引查找特定的面板和文本命令的使用方法;从分类索引查找特定类别信息(在线帮助中没有此类索引,只能在印刷手册中找到它)。 什么时候使用Support Engineer:Support Engineer能帮你计划CFD模拟工程并解决在使用FLUENT 中所遇到的困难。在遇到困难时我们建议你使用Support Engineer。但是在使用之前有以下几个注意事项:●仔细阅读手册中关于你使用并产生问题的命令的信息 ●回忆导致你产生问题的每一步 ●如果可能的话,请记下所出现的错误信息 ●对于特别困难的问题,保存FLUENT出现问题时的日志以及手稿。在解决问题时,它是最好的资源。

jetTemplate模板学习和使用

一、如何配置jetTemplate ? ? ? ? ?

拓展方法:可以非常好的进行格式化处理和一些小的模板处理。

?? ??? ???? ?

?o o

二、model and view 我们发现在这一块基本上没有什么区别,把数据对象放在map中,在后面的页面就可以帮我们完成整个的处理。 返回值表示对应的html文件。 这一块没有什么问题。这一块非常方便。 三、页面的布局 jetbrick-template samples

#for(UserInfo user: userlist) #end
ID 姓名 邮箱 书籍
${user.id} ${https://www.doczj.com/doc/cc4986713.html,} ${user.email} 书籍列表
#include("includes/footer.jetx")

整个的思路也非常简单,就是使用#include和#tag layout_block("mainContent")两个标志就可以搞定了。 四、页面渲染 这一块也很简单,看上面的例子和官网上的说明就OK了。

JADE教程

JADE教程 1. Jade5.0的安装和设置 Jade5.0都是自动安装的,这不成问题。要把PDF卡片引入,先将ICDD的光盘插入,然后pdf/setup/select all/,其它按提示进行。 可以对优选项进行设置:EDIT/preference/,里面包括了对显示窗口的设置,仪器参数的设置,打印输出的设置等。 2 .数据的输入 Jade软件可以直接读取Rigaku、Bruker、Philips、Scintag等很多衍射仪的原始数据。打开File\patterns,将出现如附件中所示画面,先(I)找到你文件位置,从(III)的下拉框中选择你的数据格式,按(II)选择。很多仪器输出文件的格式都是*.raw,实际上都是不一样的,但格式选错了也没关系,软件会给你自动转到合适的格式中去的。 高级一点的:有一些数据格式在(III)的下拉框中没有,比如最常见的txt,xy 等,此时你可以自己动手设置,在以上的数据输入面板中,点击工具栏上的“import",进入格式设置画面,如附件所示,a区为注释区,b区为数据格式区,对于最简单的一列角度,一列强度的数据格式,a区不用填写,b区在”angle column“前打上勾,数据从第1行开始读,每行1列数据,强度数据从第8行开始(角度不算),角度从1至6列,所得数据格式即为附件中所示的数据格式。你也可以按照自己的数据格式进行自由改动,如果a区中表明第1行有说明文字,则数据从第2行读入,相应在b区就将data starts改成2。做完上面的工作后,将文件后缀改为你的数据后缀(箭头所指),再将该格式保存下来便可大功告成了。 3. 基本功能使用:平滑,扣背底

fluent学习笔记

fluent技术基础与应用实例 4.2.2 fluent数值模拟步骤简介 主要步骤: 1、根据实际问题选择2D或3Dfluent求解器从而进行数值模拟。 2、导入网格(File→Read→Case,然后选择有gambit导出的.msh文件) 3、检查网格(Grid→Check)。如果网格最小体积为负值,就要重新 进行网格划分。 4、选择计算模型。 5、确定流体物理性质(Define→Material)。 6、定义操作环境(Define→operating condition) 7、制定边界条件(Define→Boundary Conditions) 8、求解方法的设置及其控制。 9、流场初始化(Solve→Initialize) 10、迭代求解(Solve→Iterate) 11、检查结果。 12、保存结果,后处理等。 具体操作步骤: 1、fluent2d或3d求解器的选择。 2、网格的相关操作 (1)、读入网格文件 (2)、检查网格文件 文件读入后,一定要对网格进行检查。上述的操作可以得到网格信息,从中看出几何区域的大小。另外从minimum volume 可以知道最小网格的体积,若是它的值大于零,网格可以用于计算,否则就要重新划 分网格。 (3)、设置计算区域 在gambit中画出的图形是没有单位的,它是一个纯数量的模型。故 在进行实际计算的时候,要根据实际将模型放大或缩小。方法是改变fluent总求解器的单位。 (4)、显示网格。 Display→Grid 3、选择计算模型

(1)、基本求解器的定义 Define→Models→Solver Fluent中提供了三种求解方法: ·非耦合求解 segregated ·耦合隐式求解 coupled implicit ·耦合显示求解 coupled explicit 非耦合求解方法主要用于不可压缩流体或者压缩性不强的流体。 耦合求解方法用在高速可压缩流体 fluent默认设置是非耦合求解方法,但对于高速可压缩流动,有强的体积力(浮力或离心力)的流动,求解问题时网格要比较密集,建 议采用耦合隐式求解方法。耦合能量和动量方程,可以较快的得到收敛值。耦合隐式求解的短板:运行所需要的存比较大。若果必须要耦合求解而机器存不够用,可以考虑采用耦合显示求解方法。盖求解方法也耦合了动量,能量和组分方程,但是存却比隐式求解方法要小。 需要指出的是,非耦合求解器的一些模型在耦合求解器里并不一定都有。耦合求解器里没有的模型包括:多相流模型、混合分数/PDF燃烧模型、预混燃烧模型。污染物生成模型、相变模型、Rosseland辐射模型、确定质量流率的周期性流动模型和周期性换热模型。 %%%有点重复,但是可以看看加深理解 Fluent提供三种不同的求解方法;分离解、隐式耦合解、显示耦合解。分理解和耦合解的主要区别在于:连续方程、动量方程、能量方程和 组分方程解的步骤不同。 分离解按照顺序解,耦合解是同时解。两种解法都是最后解附加的标量方程。隐式解和显示解的区别在于线性耦合方程的方式不同。 Fluent默认使用分离求解器,但是对于高速可压流动,强体积力导致 的强烈耦合流动(流体流动耦合流体换热耦合流体的混合,三者相互耦合的过程—文档整理者注)(浮力或者旋转力),或者在非常精细的网格上的流动,需要考虑隐式解。这一解法耦合了流动和能量方程, 收敛很快。%%% (2)、其他求解器的选择 在实际问题中,除了要计算流场,有时还要计算温度场或者浓度场等,因此还需要其他的模型。主要的模型有: Multiphase(多相流动)viscous(层流或湍流)energy(是否考虑传热)species(反应及其传热相关) (3)操作环境的设置 Define→operation→condition

FLUENT UDF 教程

FLUENT UDF 教程 第一章. 介绍 本章简要地介绍了用户自定义函数(UDF)及其在Fluent中的用法。在1.1到1.6节中我们会介绍一下什么是UDF;如何使用UDF,以及为什么要使用UDF,在1.7中将一步步的演示一个UDF例子。 1.1 什么是UDF? 1.2 为什么要使用UDF? 1.3 UDF的局限 1.4 Fluent5到Fluent6 UDF的变化 1.5 UDF基础 1.6 解释和编译UDF的比较 1.7一个step-by-stepUDF例子 1.1什么是UDF? 用户自定义函数,或UDF,是用户自编的程序,它可以动态的连接到Fluent求解器上来提高求解器性能。用户自定义函数用C语言编写。使用DEFINE宏来定义。UDF中可使用标准C 语言的库函数,也可使用Fluent Inc.提供的预定义宏,通过这些预定义宏,可以获得Flu ent求解器得到的数据。 UDF使用时可以被当作解释函数或编译函数。解释函数在运行时读入并解释。而编译UDF则在编译时被嵌入共享库中并与Fluent连接。解释UDF用起来简单,但是有源代码和速度方面的限制不足。编译UDF执行起来较快,也没有源代码限制,但设置和使用较为麻烦。 1.2为什么要使用UDF? 一般说来,任何一种软件都不可能满足每一个人的要求,FLUENT也一样,其标准界面及功能并不能满足每个用户的需要。UDF正是为解决这种问题而来,使用它我们可以编写FLUEN T代码来满足不同用户的特殊需要。当然,FLUENT的UDF并不是什么问题都可以解决的,在下面的章节中我们就会具体介绍一下FLUENT UDF的具体功能。现在先简要介绍一下UDF的一些功能: 定制边界条件,定义材料属性,定义表面和体积反应率,定义FLUENT输运方程中的源项,用户自定义标量输运方程(UDS)中的源项扩散率函数等等。λ 在每次迭代的基础上调节计算值λ 方案的初始化λ (需要时)UDF的异步执行λ 后处理功能的改善λ FLUENT模型的改进(例如离散项模型,多项混合物模型,离散发射辐射模型)λ 由上可以看出FLUENT UDF并不涉及到各种算法的改善,这不能不说是一个遗憾。当然为了源代码的保密我们还是可以理解这样的做法的。其实,如果这些代码能够部分开放,哪怕就一点点,我想FLUENT会像LINUX一样发展更为迅速,使用更为广泛。遗憾的是,从目前来看,这只是一种幻想。什么时候中国人可以出自己的精品? 1.3 UDF的局限 尽管UDF在FLUENT中有着广泛的用途,但是并非所有的情况都可以使用UDF。UDF并不能访

Twig模板引擎使用笔记

Twig模板引擎使用笔记 安装配置 1.新建一个目录 libs 2.在该目录下新建文件 composer.json,往该文件写入以下内容: 3.{ 4. "require": { 5. "twig/twig": "1.*" 6. } 7.} 8.在 libs 目录上执行 composer install 安装 Twig(前提是已安装 Composer 包管理器) 9.在 libs 上级目录新建三个文件夹:templates、templates_c、web,其中 templates 用来存放 模板文件,templates_c 用来存放编译缓存文件,web 用来存放 PHP 源文件 10.在 libs 上级目录新建文件 MyTwig.php 公共文件,内容如下: 11.// 引用 Composer 自动加载文件 12.require_once dirname(__FILE__).'/libs/vendor/autoload.php'; 13. 14.// 注册 Twig 加载器 15.Twig_Autoloader::register(); 16. 17.// 设置基本的配置项 18.$loader = new Twig_Loader_Filesystem(dirname(__FILE__).'/templates'); 19.$twig = new Twig_Environment($loader, array( 20. 'cache' => dirname(__FILE__).'/templates_c', 21. 'auto_reload' => true 22.)); 23.后续使用时,只需让 web 目录下的 PHP 文件引用该公共文件,且在 templates 目录下放置好 对应的模板即可,引用公共文件的语句为:require_once dirname(dirname(__FILE__)).'/MyTwig.php'; 24.基本的模板渲染语句:echo $twig->render('abc.html.twig', array('name' => 'Ruchee')); 可用符号 == != < > >= <= + - ~ * / // % ** | [] . .. and or not in is b-and b-or b-xor 部分符号的含义如下 ?~:连接两字符串,相当于 PHP 中的点号 ?//:整除 ?**:乘方,相当于 PHP 中的 ^ ?b-and、b-or、b-xor:按位与、按位或、按位异或 ?-:减法以及去除空白的简写用法,如 {{- 数据 }} => 去除左边的空白、{{ 数据 -}} => 去除右边的空白、{{- 数据 -}} => 去除两边的空白

JADE中文教程,包还一个真实系统

目录 第一章绪论 (3) 1.1问题概述 (3) 1.2该领域技术发展现状 (3) 1.3全文安排 (5) 第二章AGENT简介 (6) 2.1Agent技术的起源与发展 (6) 2.2Agent定义 (7) 2.3Agent的适用领域 (10) 2.4agent技术的标准化 (10) 第三章JADE平台介绍 (12) 3.1JADE平台简介 (12) 3.2JADE的特点 (14) 3.3用JADE创建多Agent系统 (15) 3.3.1Agent平台 (15) 3.3.2Agent类 (17) 3.3.3Agent任务.执行Agent行为 (19) 3.4交互协议 (21) 3.5对移动Agent的支持 (22) 第四章基于JADE平台上的"图书交易"系统 (23) 4.1"图书交易"系统要实现的功能 (23) 4.1.1买方Agent (23) 4.1.2卖方Agent (23) 4.2建立JADE Agent-Agent类 (24) 4.2.1agent标识符 (24) 4.2.2结束Agent (25) 4.2.3向Agent中传递参数 (25)

4.3Agent执行的任务-Behaviour类 (27) 4.3.1行为调度和执行 (28) 4.3.2在特定的时间点执行某个操作 (31) 4.4"图书交易"系统执行的行为 (32) 4.4.1买方Agent的行为 (33) 4.4.2卖方Agent的行为 (34) 4.5Agent间通讯-ACLMessage类 (37) 4.5.1发送消息 (37) 4.5.2"图书交易"系统中的各类消息 (37) 中文翻译 (95) 1 介绍 (95) 2 JADE 特点 (99) 3 用JADE创建多agent系统 (100) 3.1 Agent平台 (100) 3.2 Agent类 (105)

jade5.0使用说明

摘取如下(无图片) NO1 Jade5.0的安装和设置 Jade5.0都是自动安装的,这不成问题。要把PDF卡片引入,先将ICDD的光盘插入,然后pdf/setup/select all/,其它按提示进行。 可以对优选项进行设置:EDIT/preference/,里面包括了对显示窗口的设置,仪器参数的设置,打印输出的设置等,一般来说按默认就行,我本人则喜欢将MISC栏里的“Materials Data, Inc.”改为我自己的大名,哈哈。 No2 数据的输入 Jade软件可以直接读取Rigaku、Bruker、Philips、Scintag等很多衍射仪的原始数据。打开File\patterns,将出现如附件中所示画面,先(I)找到你文件位置,从(III)的下拉框中选择你的数据格式,按(II)选择。很多仪器输出文件的格式都是*.raw,实际上都是不一样的,但格式选错了也没关系,软件会给你自动转到合适的格式中去的。 高级一点的:有一些数据格式在(III)的下拉框中没有,比如最常见的txt,xy等,此时你可以自己动手设置,在以上的数据输入面板中,点击工具栏上的“import",进入格式设置画面,如附件所示,a区为注释区,b区为数据格式区,对于最简单的一列角度,一列强度的数据格式,a区不用填写,b区在”angle column“前打上勾,数据从第1行开始读,每行1列数据,强度数据从第8行开始(角度不算),角度从1至6列,所得数据格式即为附件中所示的数据格式。你也可以按照自己的数据格式进行自由改动,如果a区中表明第1行有说明文字,则数据从第2行读入,相应在b区就将data starts改成2。 做完上面的工作后,将文件后缀改为你的数据后缀(箭头所指),再将该格式保存下来便可大功告成了。 No 3 基本功能使用:平滑,扣背底 一张XRD图谱出来,往往因为有空气散射,漫散射,荧光以及样品结晶差等等原因而造成图谱上存在许多“毛刺”和较高的背底,虽然提高X光强度能成倍提高信噪比,然而有时受仪器和样品所限,这两项功能需要用到。但根据我个人的经验,要尽量少使用平滑和扣背底,因为这两项操作带来的可能后果就是将一些微弱的有用信息一概抹掉了,特别注意的是,如果将数据用来做Rietveld精修,更不要进行这两项操作。当然,如果是将图谱打印出来给别人看,适当进行平滑和扣背底也是个不错的选择。 1 平滑 打开Filters/smooth pattern或在快捷工具栏中右键点击也可。随后将出现一个悬浮框,最上面的一栏中方块可以直接用鼠标拖动,大家试试看图谱会有什么变化,拖到什么位置,根据情况而定,我的经验是将方块拖到尖峰的底部出现倒生的毛刺之前。再下面有“parabolic filter"和”quartic filter"的选择,选择后一个的效果稍好。再下面还有选择框,我一般都不管它。作完以上操作后,再用鼠标左键点击快捷工具栏中的平滑图标即可。 2 扣背底 打开analyze/fit background或在快捷工具栏中右键点击也可。随后也出现一个如附件中所示的悬浮框,(I)处所示代表了背底拟合的级数,点击越靠前,该级数越高,也可在右边选择是一次拟合,抑或二次和三次拟合,试情况而定,背底偏离线性越远,则拟合的级数要求越高。 背底曲线用黄线表示,红点代表了背底在局部的最高点,左键点击图谱上的某一处便可

fluent中文简明教程

第一章Fluent 软件的介绍 fluent 软件的组成: 软件功能介绍: GAMBIT 专用的CFD 前置处理器(几何/网格生成) Fluent4.5 基于结构化网格的通用CFD 求解器 Fluent6.0 基于非结构化网格的通用CFD 求解器 Fidap 基于有限元方法的通用CFD 求解器 Polyflow 针对粘弹性流动的专用CFD 求解器 Mixsim 针对搅拌混合问题的专用CFD 软件 Icepak 专用的热控分析CFD 软件 软件安装步骤: 前 处 理 gambit 软 件 Fluent6.0 Fluent5.5&4.5 Fidap Polyflow Mixsim Icepack 通用软件 专用软件

step 1: 首先安装exceed软件,推荐是exceed6.2版本,再装exceed3d,按提示步骤完成即可,提问设定密码等,可忽略或随便填写。 step 2: 点击gambit文件夹的setup.exe,按步骤安装; step 3: FLUENT和GAMBIT需要把相应license.dat文件拷贝到FLUENT.INC/license目录下; step 4:安装完之后,把x:\FLUENT.INC\ntbin\ntx86\gambit.exe命令符拖到桌面(x为安装的盘符); step 5: 点击fluent源文件夹的setup.exe,按步骤安装; step 6: 从程序里找到fluent应用程序,发到桌面上。 注:安装可能出现的几个问题: 1.出错信息“unable find/open license.dat",第三步没执行; 2.gambit在使用过程中出现非正常退出时可能会产生*.lok文件,下次使用不能打开该工作文件时,进入x:\FLUENT.INC\ntbin\ntx86\,把*.lok文件删除即可; 3.安装好FLUENT和GAMBIT最好设置一下用户默认路径,推荐设置办法,在非系统分区建一个目录,如d:\users a)win2k用户在控制面板-用户和密码-高级-高级,在使用fluent用户的配置文件 修改本地路径为d:\users,重起到该用户运行命令提示符,检查用户路径是否修改; b)xp用户,把命令提示符发送到桌面快捷方式,右键单击命令提示符快捷方式在快捷方式-起始位置加入D:\users,重起检查。 几种主要文件形式: jou文件-日志文档,可以编辑运行; dbs文件-gambit工作文件; msh文件-从gambit输出得网格文件; cas文件-经fluent定义后的文件; dat文件-经fluent计算数据结果文件。 第二章专用的CFD前置处理器——Gambit GAMBIT软件是面向CFD的前处理器软件,它包含全面的几何建模能力和功能强大的网格划分工具,可以划分出包含边界层等CFD特殊要求的高质量的网格。GAMBIT可以生成FLUENT5、FLUENT4.5、FIDAP、POL YFLOW等求解器所需要的网格。Gambit软件将功能强大的几何建模能力和灵活易用的网格生成技术集成在一起。使用Gambit软件,将大大减小CFD应用过程中,建立几何模型和流场和划分网格所需要的时间。用户可以直接使用Gambit软件建立复杂的实体模型,也可以从主流的CAD/CAE系统中直接读入数据。Gambit软件高度自动化,所生成的网格可以是非结构化的,也可以是多种类型组成的混合网格。 一. Gambit图形用户界面:

20个代码生成框架

20个代码生成框架 1 1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://https://www.doczj.com/doc/cc4986713.html, 官方论坛:http://https://www.doczj.com/doc/cc4986713.html,/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单、好用。 所有api可以在帮助菜单中找到。 官方网站:http://https://www.doczj.com/doc/cc4986713.html,/portal/default.aspx 官方论坛: 版权形式:免费 开源:否 1.3 NHibernate. NHibernate是Hibernate公司在Java自动生成领域取得巨大成功后推出的一款ORM工具. 官方网站:http://https://www.doczj.com/doc/cc4986713.html,/ 官方论坛: 版权形式:免费 开源:否 1.4 湛蓝.Net代码生成器

一款基于软件自动生成理念,能直接生成应用的dotnet代码生成器 官方网站:http://https://www.doczj.com/doc/cc4986713.html, 官方论坛:http://https://www.doczj.com/doc/cc4986713.html,/ 版权形式:免费 开源:否 1.5 动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 官方网站:http://https://www.doczj.com/doc/cc4986713.html, 官方论坛: 版权形式:免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大 官方网站:http://https://www.doczj.com/doc/cc4986713.html, 官方论坛: 版权形式:需要少量的注册费用 开源:否 下载地址很神秘 1.7 CodeMaker asp,jsp,php代码生成工具,自动生成维护数据库信息的动态网页的代码生成器。它可以帮助ASP、JSP、PHP开发人员快速的开发简单的数据库维护程序。无需任何编码,只需将数据库结构导入到CodeMaker中并做简单的设置,CodeMaker即可生成完整的数据库操作页面。用CodeMaker可以简单快速的创建网站后台维护程序。提高开发效率数十倍以

(完整word版)jade6.5教程(xrd物相分析)

第一部分物相分析 1.打开您的数据。File—read… 打开后的界面如图1: 图1 2.很多人说打开数据后要平滑曲线,但是我个人认为还是先不要平滑的好,因为每一次的平滑曲线操作都会造成数据失真。我更倾向于物相分析完毕后,平滑曲线,使得输出的报告更易读。但是,到底要不要在此平滑曲线取决于您自己。平 滑曲线的操作如下: 右击图2中箭头所指按钮,可以进行参数设置,左击就是平滑曲线。

图2 3.物相分析。一般的,物相分析要至少分3轮进行,这样才能把所有的物相找出来。这3轮分别命名为大海捞针、单峰分析、指定元素分析。 首先左击按钮寻峰。 (1)“大海捞针”物相分析:右击图3箭头所指按钮,出现图4所示标签。在General 选项里,首先勾选上左侧的所有的库,去掉右侧所有的对勾,其他设置如图4所示,最后左击ok。 图3

图4 完成上述步骤,出现图5所示界面。显示了矿物名称、化学式、FOM值、PDF-#、RIR等内容。矿物的排序是按FOM值由小到大排列的,FOM值越小,表示存在这种矿物的可能性越大(但不绝对)。当鼠标左击到一个矿物时,在X衍射图谱显示栏会显示蓝色的线,选择与X衍射图谱拟合最好的矿物,然后在矿物名称前面勾选,表示你认为存在此矿物(如图6)。注意:选择矿物时,要尽量选取有RIR值的矿物,否则后面的定量工作将不能继续。 图5 图6

(2)单峰分析:完成大海捞针后,可能还有峰没有对上,此时要用此法。 在大海捞针的基础上,左击图7方框内的按钮,然后按照图8内标明的步骤操作。然后重复大海捞针的操作(与大海捞针不同的是,此时系统只选择与你选中的峰对应的物相)。 图7

CMS系统模版引擎设计(3):Label基类的设计

上节讲了页面的整个生产流程,大家都期待第三篇,也就是生产的核心内容——Label的替换。说实话,我很有压力啊:)一个人一个实现思路,所以...可能你不能接受。 我的标签分为2种,一种是配置变量标签(就是站点和系统的Config),用%变量名%表示,在初始化Labels之前是要执行替换的。另外一种就是数据调用的Label咯。看下风格: //简单的循环列表 {Article:List Top="10" CategoryId="5"} [field:Title/] {/Article:List} //引用用户控件模版,CategoryId是需要传递的参数 {System:Include TemplateId="5" CategoryId="7"/} //详情页模版 {Article:Model ArticleId="Url(articleid)"}

[field:Title/]

{/Article:Model} {Artcile:Model name="PostTime"dateformat="yyyy年MM月dd日"/} 大家可以看出点端倪了吧,格式都是统一的。我来说下: Article:List:是Article模块下的List标签 Top :调用条数 CategoryId:分类ID 当然还支持其他的属性比如Skip,Class,Cache等等,这些属性关键是看List标签的支持度。 下面的...当然是循环部分,而[field:FieldName/]则是具体的字段,接着是关闭标签。 但例如System模块的Include标签却没有内容部分。 而详情页的字段展示和列表不同,他的字段可以任意位置摆放。所以可以下面的那个Model虽没有ID也可以输出:)这些七七八八的细节比较多。 我们如何解释这些标签代码呢?

jade5.0分析XRD数据基本过程

现在将通过实例初步介绍jade5.0的基本操作步骤。 1、数据输入 由于不同的X射线衍射仪输出的数据类型不同,但都可以将数据转换成txt 文档或Ascii格式的文档(文件名为*.txt或*.asc),为提高软件的通用性jade5.0提供了以txt文档或Ascii格式输入数据。运行jade5.exe首先进入以下界面 中间的窗口用于选择需打开文件,左侧选择文件路径与资源管理器的操作相同, 右侧选择打开文件的类型,一般选择XRD Pattern files(*.*),这时在右下方 的窗口中将显示左侧被选择文件夹中所有能被该软件识别的文件,然后选择需要

分析的数据文件,点击菜单栏Read进入主窗口,此选择窗口可以通过主窗口中file/patterns进入。 2、背景及Ka2线扣除 在主菜单栏中选择analyze/fit background进入如下窗口: 该窗口用于设置扣除背景时的参数,一般选择默认值直接选择apply,回到主窗口,此时软件自动运行Edit bar/B.E按钮,用于手动修改背景, Edit bar工具栏如下:

此工具栏提供了放大、标定峰位等操作,当鼠标移动到按钮上时软件将自动提示。在该软件中的所有按钮对鼠标左右键操作都有不同效果,一般左键为确定或正向操作,右键为取消或反向操作。 3、确定峰位 在主菜单栏中选择analysie/find peaks,进入确定峰位所需的参数设置窗口,如下图,一般选择默认值,选择apply回到主窗口,选择Edit bar左第三个按钮可手动编辑。 在手动编辑过峰个数或峰位后,同样可以选择analyze/find peaks,选择Report,进入如下界面:

Discuz模板引擎标签

Discuz模板引擎标签 2009-06-03 09:18 Discuz! 的模板采用近似 PHP 表达式的语法,支持的元素如下: 1. 逻辑元素包围符,该符号用于包含条件和循环元素,其中: statement1 statement2 statement3 为一个典型的条件模板,当条件 expr1 为真时,显示模板 statement1 内容;否则当 expr2 为真时,显示模板 statement2 内容,否则显示模板 statement3 的内容.如同 其他语言中的条件控制一样,其中 和 是非 必须的. statement 相当于 PHP 的数组循环语句 foreach($array as $value) { statement } 而 statement 相当于 PHP 的数组循环语句

foreach($array as $key => $value) { statement } 逻辑元素包围符在 { } 外面包含了 html 的注释符号 ,除了为了和信息元素 相区别外,也方便了使用 Dreamweaver 和 Frontpage 之类工具编辑模板的用户.因逻 辑元素会被识别为 html 的注释而不被显示,对于绝大多数用户,逻辑元素中的内容是 完全不需要修改的,甚至修改错一个字符就可能引起错误信息和整个系统无法运行.因 此通常您在修改模板的时候,不要修改模板的逻辑信息,更不要将逻辑信息内部元素(如 等)的位置,否则可能会导致错误.如果您的模板被不慎修改损坏,请立 即用原始模板覆盖,即可恢复. 对于高手而言,实际上外部的 是可以省略不写的,可以用于某些元素在模板 中的定位,但强烈建议普通用户不要轻易尝试. 2. { ... } 信息元素包围符,其中 {CONSTANT} 可以引用界面替换变量,其中必须为大写字母,该符号实际的作用是引用 PHP 常量 CONSTANT,因此也可以通过它来引用其他的常量内容. {lang variable} 可以在模板中引用语言变量 variable 的内容,语言变量经由 https://www.doczj.com/doc/cc4986713.html,ng 中数组 $language 定义. 如 {lang post_edit} 的内容在编译模板的时候被替换为 $language['post_edit'] 的内容,简体中文版的意思是 "编辑帖子". {faq variable} 可以在模板中引用论坛帮助的帮助关键字,在后台=>其他设置=》论坛帮助=》具体某个帮助的详情可以看到或者设置 3. {template name} 模板嵌入符,为了避免模板的冗长,可以使用本符号来将 name 模板的内容嵌

相关主题
文本预览
相关文档 最新文档